我正在编写一个 codeigniter 应用程序,在执行查询时遇到以下 fatal error 。
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in /var/www/html/cryd/_zcore/core/Loader.php on line 262
我可以增加允许的内存大小,但问题似乎更严重,如果是内存泄漏,我只会给 php 更多内存来玩。查询甚至没有那么密集,它只返回一行数据。
这是我的 Controller
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Invest_webhook extends CI_Controller {
private $web_msg = null;
private $proceed = 1;
private $data = null;
private $receive = null;
private $complete = 0;
private $member = null;
private function loadPage($page,$data=null){
$data = array_merge($data,$this->lang->language);
$this->parser->parse('dashboard/header',$data);
$this->parser->parse('dashboard/'.$page);
$this->parser->parse('dashboard/footer');
}
public function webhook(){
echo memory_get_peak_usage()."<br/>";
//$update = file_get_contents("php://input");
//$update = json_decode($update,true);
$update = array(
'notification_id' => '57233292b6a3d133e9c83822',
'delivery_attempt' => 1,
'type' => 'address',
'data' => Array(
'network' => "BTCTEST",
'address' => '2N1jfZt8Uc721FAWNjdVpQZjfTxeG271RKy',
'balance_change' => 1.00000000,
'amount_sent' => 0.00000000,
'amount_received' => 1.00000000,
'txid' => '',
'confirmations' => 4,
'is_green' => false
),
'created_at' => 1497176944
);
$data = $this->get_investment_data($update['data']['address']);
if(!$data){
die('This address does not exist');
}
$this->data = $data[0];
$this->member = $this->get_member_data($this->data['tid']);
//Start the process to verify transaction and credit investment
$this->verify_investment();
$this->update_investment();
//$parameter = $this->web_msg;
//include APPPATH."libraries/telegrambotv2.php";
//$bot = new Telegram('331263599:AAEpHNAdyN1X5TenBk_QkJdt7xfwzDI6YeQ','bot');
echo $this->web_msg."<br/>";
}
private function verify_investment(){
include APPPATH."/libraries/BlockIo.php";
$this->load->config('block');
$block = new BlockIo($this->config->item('api_token'),$this->config->item('api_secret'));
$address = ($this->data['address']);
$receive = $block->get_address_balance(array('addresses' => $address));
$receive = $receive->data->available_balance;
$expect = $this->data['inv'];
settype($receive,'float');
settype($expect,'float');
echo '<br/>'.$receive."<br/>".$expect."<br/>";
if($receive == $expect){
$this->receive = $receive;
return true;
}
$this->proceed = 0;
$this->web_msg = 'inv_mismatch';
return false;
}
private function get_member_data($tid){
$this->load->model('invest_model','invest');
return $this->get_member_data($tid);
}
private function update_investment(){
if(!$this->proceed){
return;
}
$this->load->model('invest_model','invest');
$einv = $this->member['inv'];
settype($einv,'float');
$new_inv = $einv + $this->receive;
$this->member['inv'] = $new_inv;
$this->member['last_inv'] = 'NOW()';
$this->data['confirmed'] = 1;
if($this->invest->update_investment($this->data,$this->member)){
$this->web_msg = 'inv_complete';
$this->complete = 1;
return true;
} else {
$this->proceed = 0;
$this->web_msg = 'inv_unx_err';
return false;
}
}
private function get_investment_data($address){
$this->load->model('invest_model','invest');
return $this->invest->investment_data($address);
}
private function log($text){
$file = fopen(APPPATH."/logs/investments/log.log",'a');
fwrite($file,$text);
fwrite($file,"\n");
fclose($file);
}
}
这是我的模型
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Invest_model extends CI_Model {
public function __construct(){
parent::__construct();
}
public function investment_data($address){
$this->db->where('address',$address);
$this->db->where('confirmed',0);
$f = $this->db->get('investments');
return $f->result_array();
}
public function current_investment($tid){
$this->db->select('inv');
$this->db->where('tid',$tid);
$f = $this->db->get('users');
$f = $f->row_array();
return $f;
}
public function get_member_data($tid){
echo "<hr/>";
echo memory_get_peak_usage()."<br/>";
$this->db->where('tid',$tid);
echo memory_get_peak_usage()."<br/>";
$f = $this->db->get('users');
echo memory_get_peak_usage()."<br/>";
return $f->row_array();
}
public function update_investment($inv,$member){
$this->db->trans_begin();
$this->db->set($inv);
$this->db->where('address',$inv['address']);
$this->db->update('investments');
$this->db->set($member);
$this->db->where('tid',$member['tid']);
$this->db->update('users');
if($this->db->trans_status() === FALSE){
$this->db->trans_rollback();
return false;
} else {
$this->db->trans_commit();
return true;
}
}
}
我不知道我可以在哪里进一步优化它,它非常简单和直接,如果它在我的逻辑方法中有问题,希望比我更好的头脑能够发现并进一步指导我。
提前致谢。
最佳答案
您的代码看起来不错。检查是否重复调用了某些函数。
你可以使用
ini_set('memory_limit', '-1');
作为临时解决方案。或者只是增加 memory_limit
检查你的 php.ini 文件。如果是下面的形式,
memory_limit=8G
以 MB 的形式更改它
memory_limit=8192M
你也可以在你的代码中这样做
ini_set('memory_limit', '8192M');
关于PHP fatal error 允许内存大小耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45008068/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p
我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}
我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:
这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e