2014-01-16 1 views
3

유효한 WSDL을 포함하지 않는 알려진 URL에 대한 다음 스크립트 실행을 고려PHP SoapClient가 예외를 잡은 후에도 스크립트 완료시 치명적인 오류를 발생시키지 않습니까?

예상대로
<?php 

echo "start\n"; 

try { 
    $test = new SoapClient ('http://www.example.com/'); 
} catch (Exception $e) { 
    echo "Caught exception\n"; 
} 

echo "end\n"; 

, 그것은 로그 아웃 실행하면 다음

start 
Caught exception 
end 

때문에 스크립트가 실행 않았다 SOAP 서버에 연결하는 데 실패하더라도 완료. 이것은 정확히 내가 기대했던 것입니다. 당신이 display_errors를이 켜져있는 경우

PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't find <definitions> in ' http://www.example.com/ ' in soapfail.php on line 6

, 결과는 그냥 일반 기괴한 외모 : 내가 기대하지 않았다도는/var/log/php_error에 기록하기 다음이었다.

start 
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com/' : Extra content at the end of the document 
in soapfail.php on line 6 
Caught exception 
end 

이 경우, PHP 스크립트는 그 지점에서 실행을 중단하지 않았다하더라도 치명적인 오류가 방출되는 것으로 보인다. 분명히 이것은 매우 간단하고 고안된 예제이지만 분명히 사라진 서버에 대해 SOAP 요청을하는 라이브 시스템에서이 동작을 발견했습니다. 치명적인 오류가 로그에 나타나면 우리는 오류를 올바르게 처리하지 못하고 있다고 믿게되었습니다. 사실 PHP가 없어야한다고 치명적인 오류 알림이 표시되고있는 것 같습니다.

로깅을 끄는 것 이외의 다른 동작에 대해 할 수있는 일이 있습니까 (실제로 옵션이 아님)?

UPDATE : 완전성에 대해 내가 사용하고있어 PHP 버전은,이다 :

PHP의 5.4.6-1ubuntu1.5 (CLI)는 (내장 : 2013년 12월 12일 4시 39분 44초) 저작권 (C) 1997에서 2012 사이 PHP의 그룹, 저작권 (c)는 1998-2012 젠드 기술 Derick Rethans에 의해 Xdebug는의 v2.2.1, 저작권 (C) 2,002에서 2,012 사이와

나는 또한에이 테스트 젠드 엔진 v2.4.0 비슷한 결과를 가진 내 집 컴퓨터.

PHP 5.5.5 (CLI) (내장 : 2013년 10월 20일 23시 15분 5초) 저작권 (C) 1997에서 2013 사이 PHP의 그룹 젠드 엔진 v2.5.0, 저작권 (C) 1,998에서 2,013 사이 젠드 기술을 이것은 단지 나에게 올바른 것 같지 않기 때문에

내가 버그 리포트를 제출 : Derick Rethans

업데이트 2로 Xdebug는의 V2.2.2, 저작권 (C) 2002-2013,와 . 당신이 코드를 시도 할 수 있습니다 Report on php.net

+0

이것은 나에게 이상합니다. 나는 치명적인 오류가 잡힐 수 있다는 것을 몰랐다. – Flosculus

+0

내 생각에 PHP 버그가 의심 스럽지만 확실하지 않습니다. – GordonM

+0

코드에서 오류 처리기를 설정하여 오류를 예외로 변환했을 수 있습니다. 프레임 워크를 사용하고 있습니까, 아니면 코드에 "set_error_handler"인스턴스가 있습니까? – Danack

답변

0

:

<?php 

    echo "start\n"; 

    try { 
     $test = new SoapClient ('http://www.example.com/', array('exceptions'=>true)); 
    } catch (Exception $e) { 
     echo "Caught exception\n"; 
    } 

    echo "end\n"; 

?> 

그것은 당신이 당신의 예제를 실행했을 때이 동작 단지 치명적인 오류가 발생하지 않는 예외를

+1

하지만 php_error.log의 오류는 예외가 아닙니다. –

+0

이 코드는 아무런 차이가 없으며 코드는 이전과 똑같이 동작하며 치명적인 오류는 실제로 치명적이지 않습니다. – GordonM

+0

SoapClient가 wsdl 파일을 기다리고 있기 때문에 PHP에서 치명적 오류입니다. 서버에 파일이 있는지 또는 SoapClient를 선언하지 않았는지 확인하도록 권장합니다. 죄송합니다. 내 영어 –

0

를 잡을 데 도움이 될 것입니다. 분명히 다른 PHP 버전 및/또는 구성이 적합합니다.

제 생각에 SOAP 클라이언트는 성공할 것으로 예상되며, 그렇지 않은 경우 스크립트는 계속 진행되지 않아야합니다. PHP가이 오류를 처리 할 수 ​​없다는 결정을 내리는 것은 다소 이례적인 일입니다.

개인적으로 나는이 오류를 무시하지 않거나 숨기려고하지 않고 대신 PHP가 치명적이라고 간주합니다.연결이 실패 할 경우 손을 사전에 결정할 수있는 방법을 찾거나 이상이 발생하면 정상적으로 종료되도록 응용 프로그램을 구성하십시오. 이상적으로는 프로세스를 성공에 달려있는 다른 필수 프로세스와 분리하십시오.

+0

문제는 PHP가 오류가 치명적이라고하지만 실제로는 그렇지 않습니다. SOAP 클라이언트가 연결에 실패하면 잡히고 처리되는 예외를 발생 시키지만 여전히 치명적인 오류를 기록합니다. 문제는 오류 메시지가 오도 된 것입니다. 게다가 SOAP 요청이 실패하면 나중에 정리 작업을 원할 수 있습니다. – GordonM

+0

@GordonM 죄송하지만 정확한 답변을 드릴 수는 없습니다. 이것이 실제로 버그 일 경우 PHP 버그 리포트에서 더 잘 요청할 것입니다. 이상하게도 PHP 버전과 오류 처리 구성은 무엇입니까? 귀하의 질문에 그것을 고칠 수 있습니까? – Flosculus

1

이것은 버그입니다. 두 번째 업데이트에 동의합니다. SSL 인증서 이름이 일치하지 않아 인증서를 얻고 있습니다.

@ 연산자를 사용하여 출력에서 ​​오류를 억제 할 수 있었지만 시스템 종료시 최종 "죄송합니다.이 오류는 이전에보고되지 않았으므로 여기에 있습니다!"라는 결과가 나타납니다. 산출. 내 생각 엔 SOAP 라이브러리는 스크립트가 종료 될 때까지 살아있는 객체의 소멸자에서 오류를 발생시키는 것입니다.

사용자 정의 오류 처리기는 실제로 로그에서 제외하려는 경우 메시지 무시를 선택했을 수 있습니다. 치명적인 오류의 일부 유형은 사용자 정의 오류 처리기에 도달하지 않지만이 오류는 내 응용 프로그램에서 발생합니다.

관련 문제