2012-10-11 29 views
2

我遭受誤差小,沒有找到一個線索從哪裏開始?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

+5

在你的錯誤處理程序中做一個'var_dump($ question)'來看看它在那一點上是什麼。然後開始回溯調用樹以查看某個特定對象失敗的位置,從而導致非對象被傳播。 –

+0

您確定您的工廠方法正在返回您期望它返回的內容嗎? –

+0

我同意馬克。我會補充一點,更確定的檢查對象的方法是使用instance關鍵字,並確保它符合您期望的特定類或接口。 –

回答

1

我相信,通過加入我已經通過禁用垃圾收集器固定在PHP 5.3.2類似奇怪的問題: zend.enable_gc =關 爲php.ini。 (當然重新啓動Apache或任何應用程序服務器解析的PHP)

如果這不起作用,我會建議比較你的phpinfo()從一個工作的服務器到一個問題。最好將linux與linux或windows比較。也許配置中的某些東西會跳出來。

我也會提高錯誤級別以包含通知。

最後,我想用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

祝你好運!

+0

嗨!錯誤級別(當然)已經被設置爲包括通知,並且 - 根據is_object(),$ question是一個對象。禁用垃圾收集器是不行的,因爲這會導致堆棧大小超過100 MB。然而,我認爲垃圾收集器是某種程度上的問題 - 我不知道ehy它的工作原理是不同的(如果是這樣),當我從$ GLOBALS數組中請求一個值時... – BurninLeo

+0

嗯,我不知道你的確切的PHP版本或情況,但RAM是便宜的,開發人員的時間不是。 :-)我會延長你的PHP內存限制到一個像256或512MB愚蠢的數量,並嘗試它。也許在你的特定版本下搜索php bug列表。示例GC錯誤:https://bugs.php.net/bug.php?id = 48781 – runamok

相關問題