【问题标题】:"Allowed memory size" error when there's enough memory有足够内存时出现“允许的内存大小”错误
【发布时间】:2014-03-26 01:49:17
【问题描述】:

我有

PHP 致命错误:Allowed memory size of 13241728 bytes exhausted (tried to allocate 24 bytes)

脚本(php)文件为 400kb,输出为 250kb

它打开(并反序列化)几个文件,每个文件都不超过 8mb(总共 32Mb)。

例如:

while (($file = readdir($dir))!=false) {
$inf=file_get_contents($file);
$inf=unserialize($inf);
......
}

我正在使用 fast-cgi。

为什么应该足够的内存却没有足够的内存?

我一直在 php.ini 中将它从 12Mb、16、32、50(同样的错误)设置为 80Mb(哇,它有效)

现在它设置为-1,但我想弄清楚为什么会发生这种情况以及如何解决它(可能取消设置一些变量或其他东西)

【问题讨论】:

  • 您好,您能否再粘贴一些代码以便更好地理解
  • 不是输出大小,也不是脚本大小。它是您尝试加载的文件的大小,加上开销,再加上未序列化数组的大小
  • @Aman Chhabra 代码大约 400kb 我不知道显示哪个部分
  • @Martijn 你是对的,我想找到在没有数据的时候需要这么多数据的地方
  • 你可以在你的循环中添加这个,通过一些计算你可以找到坏人:php.net/manual/en/function.memory-get-usage.php

标签: php memory-management fastcgi


【解决方案1】:

这是因为 php 不知道如何正确反序列化 $inf 。

它以无限的方式循环。

您要获取的文件中有什么内容?

我认为这是因为您试图将未序列化的变量保存到自身中。

反序列化是递归的......

所以你应该这样做:

  $variable = unserialize ( $inf );

而不是

  $inf = unserialize ( $inf );

官方 php 文档:http://php.net/unserialize

【讨论】:

  • 你的意思是$inf=unserialize($inf) 循环进入自身? )))
  • yes :) 上周我在 php 中尝试序列化/反序列化对象时遇到了同样的问题
  • 很抱歉,我不知道如何帮助您
  • 我已经找到了。一个文件出现了奇怪的反序列化。在我的 win32 php 上,在 unserialize() 之后是 16Mb,在服务器上是 60Mb。
  • 根据我的经验,序列化/反序列化应该只用于数组或简单对象......因为它需要大量的处理时间和内存,我不知道你的项目是关于什么的,但是你可能尝试不同的方法,以优化您的流程...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2023-03-20
相关资源
最近更新 更多