允许的内存大小为 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,268435456 也大于 265553811 和我收到的其他装载。谁能解释一下为什么它是这样计算的,或者分享 link 我可以在其中阅读更多相关信息。

亲切的问候

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

PHP 还没有一个非常智能的 garbage-colector 并且通常在脚本完成时释放所有内存,通常我会 skip, count 类型的脚本和 bash 我正在执行我的脚本。

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

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

我宁愿将此添加为对 Halayem Anis 评论的评论,因为这是答案,但我现在还不能。这更像是一种解释。

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

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