【问题标题】:PHP Fatal error on line number that doesn't exist行号上不存在的 PHP 致命错误
【发布时间】:2009-11-28 18:45:23
【问题描述】:

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

这个错误的奇怪之处不是内存泄漏,它很容易排除故障。相反,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 行。

【问题讨论】:

  • 奇数。没有 AJAX 调用或可以从错误位置获取的东西?如果您删除或重命名 XMLDataStore.class.php 会发生什么,它会抱怨丢失的文件吗?如果将 die() 放入文件的第 1 行会发生什么,输出肯定会停止吗? 100% 确定?
  • AJAX 没有在任何地方使用。此类是更大的 Web 应用程序的一部分,并且正在自动加载。没有花哨的自动加载器缓存正在进行。如果我重命名文件或类名声明,我会得到:致命错误/Library/WebServer/Documents/Config.class.php 中找不到类'XMLDataStore' b> 在第 18 行 如果我在第 1 行放了一个 die(),它会按预期死掉。如果我然后删除 die(),我会收到关于第 981 行错误的相同错误,该错误不存在。诡异!
  • 可以发布 XMLDataStore.class.php 吗?

标签: php line-numbers


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      检查一下: Drupal.org memory allocation error

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        PHP 5.3.0 中针对 Snow Leopard 的错误? :)

        【讨论】:

          【解决方案5】:

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

          而且一个 850 行的 PHP 文件可能会严重使用一些重构。

          【讨论】:

            【解决方案6】:

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

            即。 <? 被禁用,打开 PHP 标记需要 <?php

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-06-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-18
              • 2021-01-07
              • 1970-01-01
              • 2013-02-18
              相关资源
              最近更新 更多