2

我遇到了一个小错误,没有找到从哪里开始的提示......

[2012 年 10 月 11 日 22:01:45] PHP 致命错误:在第 545 行的 /var/www/web1/html/inc/ProjectCache.php 中的非对象上调用成员函数 getVariableIndices()

听起来很简单,但这里是代码(带行号)

525 $itemData = $queryItems->fetchRows();
525 foreach ($questionData as $qData) {
526     $qp = QuestionPack::createWithData($qData, $itemData);
<snip>
538     $question = $qp->createGenerator(null);
539     if (!is_object($question)) {
540         trigger_error('Could not initialize generator ...', E_USER_WARNING);
541         continue;
542     }
543             
544     // Question variables
545     $vix = $question->getVariableIndices();
<snip>
597     $question->destroy();
598 }

createGenerator() 方法应该总是返回一个对象。出于调试原因,我添加了后续的 IF 语句 - 永远不知道我的想法是否完全错误......

destroy 方法将一些实例变量(对其他对象的引用)设置为 null,以便垃圾收集器不会停留在循环引用中。

此问题仅发生在生产系统(Debian,PHP 5.3.3-7+squeeze14)上大约 10.000 个项目中的一个中。使用相同的脚本和数据库中的相同数据,我无法在我的 Windows 开发人员系统 (PHP 5.3.1) 上复制它。

我应该注意到,在脚本到达此语句之前,已经完成了数千次方法调用(大约 14 秒的处理时间,因为在此运行期间初始化了缓存)。

我现在最好的解释是,在几兆字节的 PHP 脚本中的任何地方,我都会触发缓冲区溢出或误导垃圾收集器,以便对象在仍在使用时被释放。但是,错误总是在同一个项目中触发,总是在同一行(如果我之前放置其他调试代码,它会随着这个语句移动)。这对我的想法来说听起来很不典型。

重新启动网络服务器(当然)没有帮助。删除以前的缓存文件也无济于事。这就是我卡住的地方。其他人觉得这很奇怪吗?任何有想法从哪里开始的人?

谢谢

BurninLeo

4

1 回答 1

1

我相信我在 php 5.3.2 中解决了一个类似的奇怪问题,方法是通过添加禁用垃圾收集器:zend.enable_gc = Off 到 php.ini。(当然还有重新启动 apache 或任何正在解析 php 的应用程序服务器)

如果这不起作用,我建议将您的 phpinfo() 从工作服务器与有问题的服务器进行比较。最好将 linux 与 linux 或 windows 与 windows 进行比较。也许配置中的某些东西会跳出来。

我还将提高错误级别以包含通知。

最后我会在 $question 不是对象时使用 gettype 和 get_class 来查看它是什么。 http://www.php.net/manual/en/function.gettype.php http://www.php.net/manual/en/function.get-class.php

发生错误时也可能调用 debug_backtrace。 http://php.net/manual/en/function.debug-backtrace.php

祝你好运!

于 2012-10-11T22:16:03.317 回答