2

致命错误:第981/Library/WebServer/Documents/XMLDataStore.class.php中允许的内存大小为 134217728 字节已用尽(尝试分配 523800 字节)

这个错误的奇怪之处不是内存泄漏,它很容易排除故障。事实上,XMLDataStore.class.php 只有 850 行长,我已经在多个文本编辑器中验证了这一点。

这是与 Snow Leopard 捆绑的 PHP 5.3。我没有使用操作码缓存。这是我的 php.ini:

allow_url_fopen = Off
error_reporting = -1
display_errors = 1
display_startup_errors = 1
date.timezone = 'America/Los_Angeles'
output_buffering = Off
realpath_cache_size = 0k

XMLDataStore.class.php 最近进行了重构,它曾经超过 981 行。就好像 PHP 已经缓存了一个 2 周大的版本并正在读取它。不过,我很肯定 /Library/WebServer/Documents/XMLDataStore.class.php 的当前版本只有 850 行。

4

6 回答 6

2

这可能是换行问题吗?即 PHP 解释器的断行方式与您的 IDE/编辑器不同?我不知道 PHP 如何处理 Linux/Mac/Windows 换行符,但这可能是一种可能性。您能否在脚本的某处创建一个致命错误,并查看它显示的行号?

您的代码中是否有一些过长的行(> 65535 个字符)会混淆行数?

此外,如果您重命名文件并将其包含在新名称下,会发生什么情况?这应该解决任何搞砸的缓存问题。

于 2009-11-29T13:18:50.590 回答
1

PHP 似乎有 macintosh 样式行尾的问题,它不计算评论末尾的 cr。在朋友的苹果上打开文件后,我遇到了这个问题。我在 linux 上使用 kate 和在 Windows 上使用 Crimson Editor 将行尾更改回 Unix 样式,并且行号工作正常。

于 2010-10-29T11:42:23.487 回答
0

如果您在不存在的行上遇到错误,那么很可能是 PHP 正在缓存它。也许尝试重命名它然后执行它。

不确定 Snow Leopard,但我现在正在使用它,不得不说仅操作系统就有很多奇怪的错误,可能就是这样。

我之前在访问数据库并将信息存储在数组中时遇到了这个错误,结果我忘记了数据库有多大,当它在堆栈上传递 MB 时,我得到了那个错误并且它停止了。如果情况相似,请使用更重处理器的方法,例如连接,获取一条线/块/任何东西,然后返回。不要遍历所有内容,将其全部存储,然后做某事。

看看这个: Drupal.org 内存分配错误

希望这会有所帮助,不确定这一切有多清楚。也许显示部分脚本以了解可能导致此问题的原因。

于 2009-11-28T18:59:31.340 回答
0

虽然我不知道是什么可能导致错误的行计数(我也在 OSX 10.6 上使用 PHP 5.3。这里没有问题。),您可以通过将脚本分成更小的部分来缩小实际错误的范围。这样也许你会找到你的错误的真实位置。

无论如何,一个 850 行的 PHP 文件可能会严重使用一些重构。

于 2010-04-04T17:53:33.473 回答
0

这是更多信息。我在运行相同版本的 Snow Leopard 的不同 Mac 上尝试了相同的代码 - 很少用于开发并且不会缓存此文件的版本 - 结果相同。

接下来,我尝试将相同的代码复制到运行 PHP 5.2.8 的 Solaris 机器上。我仍然收到内存错误 - 当然,这是可以预期的,因为它确实存在 - 但 PHP 错误消息改为:

致命错误:达到“100”的最大函数嵌套级别,正在中止!在第 741 行的 /export/www/htdocs/XMLDataStore.class.php

这很有意义,因为这是由另一个方法递归调用的方法的第一行。具有相同换行符 (LF) 的完全相同的代码在所有 3 台机器上的相同 SVN 存储库中以相同的修订号签出。

雪豹的 PHP 5.3.0 中的错误?:)

于 2009-12-01T06:25:49.557 回答
0

我最近也遇到了这个问题,就我而言(Ubuntu/Nginix 上的 PHP 5.3 在 php-fpm5 下)我有一个脚本导致 500 错误而没有输出(由于它正在生产中)。在检查错误日志时,它提到 index.php 上的第 589 行,该行只有 453 行。在我的情况下,解决方案是在生产中禁用了对短标签的支持,但启用了暂存...

IE。<?已禁用并且<?php是打开 PHP 标记所必需的。

日志中的错误显然对我没有帮助,所以我花了一段时间来解决它。我把这个建议留在这里,希望它能节省一些时间。

于 2016-08-18T16:49:14.637 回答