Php Codeigniter允许在处理大文件时耗尽内存大小
我发这篇文章是为了防止其他人也在寻找同样的解决方案,因为我在这篇废话上浪费了两天 我有一个cron作业,每天使用一个非常大的文件更新数据库一次,使用以下代码:Php Codeigniter允许在处理大文件时耗尽内存大小,php,database,codeigniter,memory,activerecord,Php,Database,Codeigniter,Memory,Activerecord,我发这篇文章是为了防止其他人也在寻找同样的解决方案,因为我在这篇废话上浪费了两天 我有一个cron作业,每天使用一个非常大的文件更新数据库一次,使用以下代码: if (($handle = fopen(dirname(__FILE__) . '/uncompressed', "r")) !== FALSE) { while (($data = fgets($handle)) !== FALSE) { $thisline = json_decode($data,
if (($handle = fopen(dirname(__FILE__) . '/uncompressed', "r")) !== FALSE)
{
while (($data = fgets($handle)) !== FALSE)
{
$thisline = json_decode($data, true);
$this->regen($thisline);
}
fclose($handle);
}
这是在一个只用于cron作业的Codeigniter控制器中。$this->regen函数运行一系列不同的检查,并将行中的正确信息存储在数据库中。文件本身有超过300MB的JSON,由换行符分隔
问题:在整个内存耗尽之前,它只能处理大约20000行。我花了几个小时来解决这个问题,但没有得到任何明显的结果。我使用的是fgets,在正确的位置有$query->free_result()。这没用。然后我开始检查大约100行的循环,并观察内存的输出。我最后把它缩小到Codeigniter活动记录类——对该类的每次调用都会导致内存使用量略微增加 然后我发现了这个线索,我得到了答案。CI Active Record保存查询,以便您可以在多个函数中生成查询。(我甚至不想讨论在默认情况下打开它是多么愚蠢。) 转到/config/database.php并添加
$db['default']['save_querys']=FALSE代码>
到文件的末尾。然后确保在单个函数中使用活动记录构建和执行查询。如果你只需要关闭一个案例,使用
$this->db->save\u querys=FALSE代码>
在构造函数中或需要放置它的任何地方。这很酷,但是。。。这可能应该尽快结束,因为这不是一个“问题”。是的,我想是的。但是我没有这个能力,所以我必须等待其他人来做。@Cryan你可以不使用“解决方案”为这个问题创建一个答案,然后将其标记为已回答;)哈,我不知道我们能做到这一点:P谢谢你的帮助。虽然直到我知道要搜索什么时我才找到这个答案,但在工作中,有一台服务器处理了大量API调用,几乎立即耗尽了RAM,违反了它的限制,进程被终止了。。。这几乎就是问题的全部。有很多关于CI的事情让我摇头,但这件事花费了我们足够的时间和精力,它可能就在最上面。一个绝对的救命恩人!!成功了!非常感谢。世界跆拳道联盟!?删除save_查询删除了所有内存泄漏