我遭受誤差小,沒有找到一個線索從哪裏開始?PHP腳本拋出一個不可能的錯誤 - 在一臺服務器上,而不是另一種
[11-Oct-2012 22:01:45] PHP Fatal error: Call to a member function getVariableIndices() on a non-object in /var/www/web1/html/inc/ProjectCache.php on line 545
聲音很簡單,但這裏是代碼(帶行號)
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調試說明理由 - 永遠不知道如果我的想法是完全錯誤的......
的銷燬方法設置一些實例變量空(其他對象的引用),使垃圾收集器就不會粘在循環參考。
此問題只發生在完全相同的約10.000項目的一個生產系統(Debian的,PHP 5.3.3-7 + squeeze14)上。使用與數據庫相同的腳本和相同的數據,我無法在Windows開發者系統(PHP 5.3.1)上覆制它。
我要指出,成千上萬的方法調用的hunderts完成腳本來此語句前(約14秒的處理時間,因爲緩存在該運行中初始化)。
我現在最好的解釋是,在PHP腳本的任何地方兆我觸發緩衝區溢出或誤導的垃圾收集器,從而使該對象被釋放,儘管仍然在使用。但是,錯誤總是在同一個項目中觸發,並始終使用相同的行(如果我之前放置其他調試代碼,它會隨着此語句一起移動)。這聽起來對我的想法來說非常不典型。
重新啓動網絡服務器(當然)沒有幫助。刪除以前的緩存文件也沒有幫助。這是我卡住的地方。任何人都認爲這是受過訓練的?任何有想法的人從哪裏開始?
感謝
BurninLeo
在你的錯誤處理程序中做一個'var_dump($ question)'來看看它在那一點上是什麼。然後開始回溯調用樹以查看某個特定對象失敗的位置,從而導致非對象被傳播。 –
您確定您的工廠方法正在返回您期望它返回的內容嗎? –
我同意馬克。我會補充一點,更確定的檢查對象的方法是使用instance關鍵字,並確保它符合您期望的特定類或接口。 –