致命错误:允许的内存大小已用尽

Posted

技术标签:

【中文标题】致命错误:允许的内存大小已用尽【英文标题】:Fatal error: Allowed memory size exhausted 【发布时间】:2010-05-05 10:07:31 【问题描述】:

您好,我刚刚将我的 php 测试脚本上传到在线 vps 服务器。该脚本用于解析一个很大的 XML 文件(大约 4M,7000Lines)。但是我的 IE 浏览器显示下面的在线错误消息。

致命错误:第 26 行 /var/www/test/result/index.php 中允许的内存大小为 16777216 字节已用尽(尝试分配 77 字节)

我确定我已经成功地在 localhost 上测试了 php 脚本。

是否需要在我的 VPS 上启用/修改任何配置?例如 php.ini 或 apache 服务器的一些设置?我刚刚验证了我的 VPS 可以使用大约 200M 内存。我该如何解决这个问题?

......
function startElementHandler ($parser,$name,$attrib)
    global $usercount;
    global $userdata;
    global $state; // Line #26; 
    //Debug
    //print "name is: ".$name."\n";
    switch ($name) 
        case $name=="_ID" : 
        $userdata[$usercount]["first"] = $attrib["FIRST"];
        $userdata[$usercount]["last"] = $attrib["LAST"];
        $userdata[$usercount]["nick"] = $attrib["NICK"];
        $userdata[$usercount]["title"] = $attrib["TITLE"];
        break;
        

        ......

        default : $state=$name;break;
    

【问题讨论】:

请记住,有一天您的 XML 可能会超出您的可用内存... 您使用哪个库来解析文件?如果它是一个大文件,您可能需要考虑使用 XMLReader 而不是任何其他库,因为它不必先将整个文档加载到内存中。 @Gordon,我没有使用一些库,我只是找到了教程 'codehelp.co.uk/php/xmlparse1.php' 并用我的 XML 文件进行了练习。稍后我会学习 XMLReader。谢谢。 本教程使用 XmlParser 库。试试这种方法:ibm.com/developerworks/library/x-pullparsingphp.html 【参考方案1】:

您的 PHP 配置将 PHP 限制为仅 16 兆字节的内存。需要修改php.ini中的memory_limit配置指令来增加。

在 php.ini 中查找如下所示的行:

memory_limit = 16M

...并更改为一个较大的值(16M = 16 兆字节,您可以将其增加到类似于 64M 的 64 兆字节等)。如果找不到这样的行,请添加。

如果您希望仅基于每个脚本增加它,您也可以使用ini_set() 仅更改该脚本的值。

【讨论】:

我认为最好只为这个文件设置更大的值,但保留默认配置的较低值。 @Dav,我将值修改为64M,效果很好。后来我会学习更多的 PHP 和 XML 知识并改进我的代码。 @All,谢谢。【参考方案2】:

您还可以使用memory_get_peak_usage() 找出程序的哪个部分正在占用您的记忆。

【讨论】:

【参考方案3】:

使用 SAX 解析器而不是 DOM 解析器,您不会耗尽内存。 DOM 占用的内存是实际文档流的 8 到 10 倍,而 SAX 具有合理的恒定开销,无论文档大小如何。

【讨论】:

【参考方案4】:
ini_set("memory_limit","XXM");

请注意,某些服务器会阻止此操作(尽管在 VPS 中这应该不是问题,这主要是网络托管问题)。

编辑:而不是“XX”写实际大小,如128M

【讨论】:

+1 如果您可以将其仅用于需要额外内存而不是使其全局化的代码。 @Lo'oris,我尝试将ini_set("memory_limit","128M"); 插入到我的 index.php 文件中。但它仍然无法工作。显示相同的错误消息。我想也许我的 VPS 不支持该功能。我只能选择修改 php.ini 并重新启动我的网络服务 :-(。谢谢。`【参考方案5】:

确保您已指定正确的可接受设置:

file_uploads upload_max_filesize max_input_time memory_limit max_execution_time post_max_size

您可以调用phpinfo() 函数来查找您的php.ini 文件的位置,它还会告诉您需要修改的以下设置的当前值。

您也可以使用ini_set 函数在脚本中设置其中一些值。

参见:

Howto optimize your PHP installation to handle large file uploads.

【讨论】:

【参考方案6】:

它很脏,但在某些情况下,对于大型 XML 文件,通过正则表达式获取值会更快!如果是格式良好的 XML 应该没有问题!

伪代码:

preg_match('+<title>(.*)</title>+', $xml_content, $matches);
var_dump($matches);

【讨论】:

【参考方案7】:

对于共享主机,请将此行放在 index.php 中

ini_set("memory_limit","128M");

【讨论】:

以上是关于致命错误:允许的内存大小已用尽的主要内容,如果未能解决你的问题,请参考以下文章

PHP致命错误:允许的内存大小为134217728字节已用尽

致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 71 字节)

致命错误:PHPExcel 中已用尽的允许内存大小为 134217728 字节

使用 pear :致命错误:允许的内存大小为 134217728 字节已用尽(尝试分配 6144 字节)

致命错误:允许的 33554432 字节的内存大小已用尽 [重复]

Composer 要求内存不足。 PHP致命错误:允许的内存大小为1610612736字节已用尽