2013-07-26 7 views
0

데이터를 가져 오기 위해 dll 형식의 윈도우 용으로 작성된 응용 프로그램 라이브러리를 사용하여 PI 데이터 소스에 액세스해야하는 PHP 웹 응용 프로그램이 있습니다. PHP의 non-polimorphism 때문에 polimorphism 라이브러리를 사용하기 위해 C# -Dotnet으로 작성된 래퍼를 사용하고 있습니다.Com 객체 작성시 PHP 치명적 오류가 발생했습니다.

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

문제 : PHP는 로그를 남기지 않고 com 객체 생성시 거의 항상 두 번째 요청마다 충돌합니다.

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

변수 $ 연결을 사용하지 : 내 생각은 기존의 PHP 코드에서 아마 뭔가이 치명적 오류가 발생하고 디버깅과 노력이 많이 후 나는이에 코드를 단순화이 잘못 될 수 있다고했다 못! 아직도 매일 2 시간 나는

>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 객체를 생성하려고 (AN 1000 오류로 창 오류 로그에 기록하고, 1001 - 정보) PHP-충돌을 얻을 ..

$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 문제없이 생성 된, 다시 매 2 시간 나는 PHP 치명적인 오류가있어. 나는 50 개 모두를 사용하려고 시도했는데, 그들은 모두 PI 시스템에서 아무런 문제없이 값을 읽었습니다.

변수를 설정 해제하고 GC를 호출하고 C#에서 소멸자를 호출하고 C#의 생성자를 확인하려고했습니다. (라이브러리의 객체를 만들고 예외도 없었습니다. 객체가 정상적으로 만들어졌으며 여전히 PHP가 손상되었습니다.) 그러나 문제는 사라지지 않았다.

그래서, 어떤 생각입니까? 내가 뭔가 잘못하고있다. (매 2 시간마다 값을 올바르게 읽는 것이 어떻게 잘못 될 수 있는가?)

환경은 테스트 :

  • OS : 윈도우 서버 2008 R2 64 비트/Windows 7의 교수 SP1 32/64 비트
  • PHP : 5.3.9/5.3.14/5.3.21/5.4.11
  • WS : Apache 및 IIS (몇 가지 다른 버전)

업데이트 : 문제는 마침내 C# 코드에있었습니다. COM 객체가 닫히거나 삭제되어 C#이 (다시 예외없이) 중단되고 PHP 치명적인 오류가 발생하는 결과를 초래하는 GC 호출이있었습니다.

감사합니다.

답변

0

업데이트 : 문제는 마침내 C# 코드에있었습니다. GC 개체를 닫거나 삭제할 수 없으므로 GC 호출이 발생하여 결과적으로 C#이 중단됩니다. 개체가 어딘가에 램에 보관되어 있었고 두 번째로 wrapper가 호출되었지만 단지 hanged/exited (예외없이 다시)로 PHP의 치명적 오류를 유발했습니다.

0

파일에 로그인하지 않고 반환 값이 추락하면 코드에서 부호 @이 포함 된 것처럼 보입니다.

예 :

@some_function()

이 함수를 호출하지만 것입니다 그냥 건너 뛰는 당신에게 표시되지 않습니다 오류가있는 경우. 몇 가지 오류로 인해 PHP를 중지 할 수 있습니다.

그러나 Windows 서버에서 PHP를 5.5로 업그레이드 할 수 있습니까?

당신이 줄의 코드있는 오류가 발생 알고 생략 할 경우, 그냥 isset()

을 넣어 수단이 오류가 아니라 당신이 중지하지 않으려면 것을 isset($somevar) 또는 isset(function()) true를 돌려줍니다 오류에 대한 함수는 오류가 발생한 코드 행에 isset()을 넣습니다.

클래스와 함수가 보이는 모양이 확실하지 않으므로 PHP->Wrapper->Lib->PI-System 코드로 완전히 수정 된 답변을 말할 수 있습니다.