PHP脚本会抛出一个不可能的错误 - 在一台服务器上,而不是在另一台服

时间:2012-10-11 20:23:09

标签: php object webserver

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

  

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

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

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,这样垃圾收集器就不会粘在循环引用中。

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

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

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

重新启动网络服务器(当然)没有帮助。删除以前的缓存文件也没有帮助。这是我被困的地方。其他人发现这个已经成熟了吗?谁知道从哪里开始?

由于

BurninLeo

1 个答案:

答案 0 :(得分:1)

我相信我通过添加以下内容来禁用垃圾收集器,从而在php 5.3.2中解决了类似的奇怪问题: zend.enable_gc =关闭 到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

祝你好运!