我遇到了一个小错误,没有找到从哪里开始的提示......
[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