致命错误:允许的内存大小已用尽
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 字节)