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

时间:2010-05-05 10:07:32

标签: php memory-management

嗨,我刚刚将我的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;}
    }
}

7 个答案:

答案 0 :(得分:3)

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

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

memory_limit = 16M

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

如果您只想在每个脚本的基础上增加它,您也可以使用ini_set()来更改该脚本的值。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

使用SAX解析器而不是DOM解析器,并且不会耗尽内存。 DOM占用实际文档流的内存的8-10倍,而SAX具有合理的常量开销,与文档大小无关。

答案 3 :(得分:1)

ini_set("memory_limit","XXM");

请注意,有些服务器会阻止这种情况发生(虽然在VPS中这应该不是问题,但主要是网络托管问题)。

编辑:而不是“XX”写下实际尺寸,例如128M

答案 4 :(得分:1)

确保您为:

指定了正确的可接受设置
  • 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.

答案 5 :(得分:1)

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

伪代码:

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

答案 6 :(得分:0)

用于共享主机将此行添加到index.php

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