2009-07-13 31 views
8

今天我遇到了一個有趣的問題。我們有一個利用Zend框架緩存功能的應用程序。給本申請的請求典型地調用使用以下行call_user_func_array與call_user_func

$result = call_user_func_array(array("myclass", "factory"), array($id)); 

的想法是從我們可以訪問以後工廠方法返回對象的工廠方法。當我們實現一個緩存功能時,這個調用就會死掉。沒有錯誤,只是一個白色的屏幕。錯誤日誌中沒有任何內容。我們可以在確定之前錯誤地記錄下行,但是在factory方法中嘗試error_log什麼也不做。

有趣的是,轉產到:

$result = call_user_func(array("myclass", "factory"), $id); 

修復該問題。

我們花了幾個小時尋找錯誤報告,並沒有提出很多解釋這種行爲。想到任何人?

+0

我剛剛在將所有代碼轉換爲使用名稱空間時才注意到此問題。該類很好,我可以實例化它的實例。 但是,當我拿一個實例並嘗試使用_array或者其他方法調用它時,沒有任何反應。代碼繼續,但該方法似乎永遠不會被調用。 – 2010-08-10 14:37:40

回答

2

我有問題像這樣,當一個尚未加載的類通過PHP命令調用時,__autoload無法正確觸發。據我所知,沒有其他策略比愚蠢的嘗試和錯誤,只要嘗試在PHP命令爲你解決它之前顯式調用該類的行。

$dummy = new MyClassName; 
call_user_func_array(array('MyClassName', 'method'), array($id)); 
unset($dummy); 
0

您使用的是哪個版本的PHP?在合併call_user_func_arrayReflectionClass時有一個問題。我不確定它是否已修復。

+0

我們正在使用5.2.8 – goose77 2009-07-13 17:52:24

+0

我很確定我說的問題比這個更早。 – troelskn 2009-07-13 20:00:16

0

是否進行分割?檢查你的'root'apache日誌(在任何虛擬主機之外),看看發生了什麼。如果該線程出現故障,您可能需要在PHP郵件列表和/或錯誤跟蹤器上執行此操作。

或者你可以嘗試在單用戶模式運行的HTTP,在GDB,用php的調試,編譯,看看你可以捕捉它,但多數民衆贊成了大量的工作:-)

+0

我已經搜遍了所有的日誌,並且沒有跡象表明Apache會出現故障。 我希望我有時間在單用戶模式下調試apache。 – goose77 2009-07-13 18:54:07