Allowed memory size of 134217728 bytes exhausted

14

如何解决这个问题以及为什么会出现这种情况?

Zend Server 日志:

PHP 致命错误:内存大小为 134217728 字节,已用尽(试图分配 538798977 字节),位于 C:\ Program Files(x86)\ Zend \ Apache2 \ htdocs \ test \ modules \ main.php 的第 3 行

如果直接从浏览器执行文件 main.php,则不会产生任何错误。 但是,如果我从另一个 PHP 文件中使用它的函数,则 Zend 日志会打印上述错误。


你尝试增加内存限制了吗? - Jurgo
2
使用了128MB的内存?这个脚本到底是做什么的? - DaveRandom
4
你尝试一次性分配500兆内存?天啊,你是不是试图一次性读取大量的CSV文件?如果是这样,请改为按行读取并逐行处理。 - Fluffeh
4个回答

15

我也遇到过这个问题。

增加以下变量,以便您的页面执行不会停止:

  • max_input_time(最大输入时间)
  • memory_limit(内存限制)
  • max_execution_time(最大执行时间)

8
虽然不是技术上的错误,所以不会扣分,但可能是个糟糕的建议。原始错误表明你(很可能)使用了太多的内存——你的代码中有一些问题(无限循环?)。换句话说,如果每次运行你的页面都消耗那么多内存,希望你的主机不要有太多用户 :) - Ben

10

要么在 php.ini 中增加内存限制,要么尝试将应用程序中的任何大型数据结构(如数组)进行优化。

无论如何,如果您的 PHP 应用程序使用了 128MB 的 RAM,那么可能出现了一些问题。

同时,正如评论中 Fluffeh 所指出的那样,你到底在做什么能够利用 500MB 的 RAM 呢?


8

试试这个:

ini_set('memory_limit', '-1');

php.net/memory_limit

这将允许服务器无限制地使用内存。


2
但如果你正在运行CLI模式,它非常有用。 - superarts.org
@superarts.org 和其他人:有一种方法可以更改 PHP 的 CLI 设置。输入 php --ini 并编辑正确的文件即可。 - Hugo H

2
除了用户1427811,您还可以在下载文件之前和之后监控time_limitmemory_limit
function custom_put_contents($source_url='',$local_path=''){

    $time_limit = ini_get('max_execution_time');
    $memory_limit = ini_get('memory_limit');

    set_time_limit(0);
    ini_set('memory_limit', '-1');      

    $remote_contents=file_get_contents($source_url);
    $response=file_put_contents($local_path, $remote_contents);

    set_time_limit($time_limit);
    ini_set('memory_limit', $memory_limit); 

    return $response;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接