2013-07-26 42 views
0

我有一個PHP Web應用程序,需要訪問PI數據源使用應用程序庫編寫的Windows窗體上的DLL窗體來獲取數據。由於PHP的非多態性,我們使用一個用C#-Dotnet編寫的包裝器來使用多態性庫。關於創建COM對象PHP致命錯誤

PHP->Wrapper->Lib->PI-System 

問題:PHP崩潰,沒有(每月的第二個請求幾乎總是)留下日誌,在創建COM對象。我的想法是,可能是一些在現有的PHP代碼可能是錯誤的,導致這種致命的錯誤和大量的調試和努力後,我簡化了代碼,以這樣的:

$connection = new Com('Something.SomethingClass'); 

與變量$連接不被使用決不!而每次還是第二次我讓PHP碰撞(在Windows錯誤日誌中記錄與1000錯誤和1001-信息)

>Faulting application name: php-cgi.exe, version: 5.4.11.0, time stamp: 0x511a30ec 
>Faulting module name: KERNELBASE.dll, version: 6.1.7601.17932, time stamp: 0x503275ba 
>Exception code: 0xc0000005 
>Fault offset: 0x0000d3cf 
>Faulting process id: 0x14d0 
>Faulting application start time: 0x01ce89dd0ae23748 
>Faulting application path: C:\Program Files\Zend\ZendServer\bin\php-cgi.exe 
>Faulting module path: C:\Windows\system32\KERNELBASE.dll 

於是,我就產生更多的COM對象..

$connArray = array(); 
for($i = 0; $i < 50 ; $i++){ 
    Core_System_Log::getInstance()->logWithoutMessageId('Before: ' . $i ,Core_System_Log::DEBUG); 
    $connArray[i] = new Com('Something.SomethingClass'); 
    Core_System_Log::getInstance()->logWithoutMessageId('After: ' . $i, Core_System_Log::DEBUG); 
} 

所有50個都生成沒有問題,並再次每次我試圖我得到一個PHP致命錯誤。 我試圖使用它們中的全部50個,它們都從PI系統讀取值,沒有任何問題。

我試圖取消設置變量並調用gc,從C#中調用析構函數,從C#中檢查構造函數(它只是生成庫的對象,並沒有出現異常,該對象通常是創建的,並且仍然是PHP崩潰)但問題並沒有消失。

那麼,有什麼想法嗎?我做錯了什麼(當它每次正確讀取值時,它怎麼會是錯的)?

環境下進行試驗:

  • 操作系統:Windows Server 2008的64位R2 /視窗7 SP1教授32位/ 64位
  • PHP:5.3.9/5.3.14/5.3.21/5.4.11
  • WS:Apache和IIS(幾個不同版本)

更新:問題終於在C#代碼中。有一個GC調用,它不允許COM對象被正確關閉/刪除,導致C#掛起(再次沒有例外)並「觸發」php致命錯誤。

感謝您的回覆。

回答

0

更新:問題終於在C#代碼。有一個調用GC,它不允許COM對象被正確關閉/刪除,導致C#掛起。該對象是在Ram中保存的某個地方,第二次封裝被稱爲它只是掛起/退出(再次沒有例外),這「觸發」了php的致命錯誤。

0

如果返回崩潰而沒有登錄到文件,它看起來在代碼中包含標誌@

例子:

@some_function()

這將調用函數,但是如果有也不會向您顯示,剛剛跳過任何錯誤。由於一些錯誤PHP可以停止。

但是,您可以嘗試在Windows服務器上將PHP升級到5.5嗎?

如果你知道其中的代碼行拋出一個錯誤,並希望跳過,只是把isset()

如果isset($somevar)isset(function())返回true這意味着並非錯誤,但如果你不想停止功能錯誤將isset()放在發生錯誤的代碼行上。

我不確定PHP->Wrapper->Lib->PI-System代碼裏面的類和函數的外觀如何,所以我可以告訴完全正確的答案。