我遇到了一点错误,没有找到提示从哪里开始......
[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
答案 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
祝你好运!