允许的内存大小为 268435456 字节耗尽(尝试分配 265556016 字节)


Allowed memory size of 268435456 bytes exhausted (tried to allocate 265556016 bytes)

>伙计们,关于这种错误和解决的主题很少,尽管我的情况是我有一个 cronjob,它正在使用多查询请求对数据库进行一些更新查询。我设置为接收错误电子邮件,由于此内存问题,我每天收到近 200 封。它们连接到:

system/application/libraries/MultiRequest/Handler.php. On line 132 :
while(CURLM_CALL_MULTI_PERFORM === curl_multi_exec($mcurlHandle, $activeThreads)) {

以及 :

system/application/libraries/MultiRequest/Request.php. On line 187 :
$responseData = curl_multi_getcontent($curlHandle);

我不明白一件事:

268435456比265556016大,也比265553811和其他安装268435456我收到的东西。有人可以解释为什么它以这种方式计算或分享链接,我可以在其中阅读更多有关此的信息。

亲切问候

我宁愿将其作为评论添加到Halayem Anis的评论中,因为这是答案,但我还不能。这更像只是一个解释。

当错误显示"无法分配 X 字节"时,这是对现有内存使用情况的补充。 如果您的 PHP 脚本已经在使用 200000000 字节的内存,并且它尝试分配 265556016 个字节,则265556016 + 200000000 将465556016这超过了268435456的内存限制。

您需要配置多请求以发出更少的请求(我不知道该软件,但基于 github,它会发出一堆 CURL 请求。另一种选择是将系统配置为为 PHP 提供更多内存。这是通过 PHP.ini/ini_set 文件memory_limit选项或主机配置的内容完成的。

您需要为脚本或所有 php 配置分配更多内存,/etc/php5/cli/php.ini您可以通过修改 memory_limit = 256 memory_limit = -1意味着在需要时使用您拥有的所有内存。或者您可以在脚本中使用ini_set('memory_limit', '512M');

PHP还没有一个非常智能的garbage-colector通常所有的内存在脚本完成后被释放,通常我制作skipcount类型的脚本,并从bash执行我的脚本。

skip=0
count=0
while [ ! exiting_clause ]
do
   php script.php --skip="$skip" --count="$count"
   skip=$(($skip+$count))
done

通过这种方式,我可以迭代我的所有数据,但在多个实例中,通常您将获得一些性能,并且内存使用量大大减少。

相关文章: