2014-04-11 3 views
2

도달 할 수없는 IP 주소로 fsockopen을 호출하면 PHP는 치명적 오류로 실행을 중지합니다. 그러나 호스트가 도달 할 수 없다는 것이 정상적인 상황입니다. 거기에 방법이있다, 그것은 의도적 인 동작 인 경우, 치명적인 오류의 경우에도 PHP를 막을 방지하는 방법이 있습니까?호스트에 연결할 수 없다면 fsockopen은 "연결할 수 없습니다."

프레임 워크를 사용하지 않고 직접 모든 오류를 처리합니다. 다음과 같이 정의된다

set_error_handler("errorHandler"); 
register_shutdown_function("fatalErrorHandler"); 

및 핸들러 : 나는이 같은 핸들러를 등록

function fatalErrorHandler() 
{ 
    $error = error_get_last(); 

    if($error !== NULL) { 
     $errno = $error["type"]; 
     $errfile = $error["file"]; 
     $errline = $error["line"]; 
     $errstr = $error["message"]; 

     errorHandler($errno, "FATAL: " . $errstr, $errfile, $errline,get_defined_vars(),debug_backtrace()); 
    } 
} 

function errorHandler($errno, $errstr, $errfile, $errline,$vars,$trace="") 
{ 

    // some formatting and checking 

    file_put_contents(dirname(__FILE__) . "/error/" . gmdate("YmdHis") . str_replace(".","",microtime(true)) . ".err" 
    ,"<error_log_date>" . gmdate("YmdHis") . "</error_log_date><error_log_uid>{$uid}</error_log_uid> 
    <error_log_str>{$errstr}</error_log_str> 
    <error_log_file>{$errfile}</error_log_file> 
    <error_log_line>{$errline}</error_log_line> 
    <error_log_vars>{$vars}</error_log_vars> 
    <error_log_trace>{$trace}</error_log_trace>"); 


return true; 
} 

답변

4

문제는

당신은 그 사실을 인식하지 못합니다 편집 한 후 최종 답변 종료 기능은 오류가 발생했는지 여부와 상관없이 스크립트의 끝에서 호출됩니다. 그리고 이 아니고 단지이 된 경고 일지라도 즉시 스크립트를 멈추십시오. error_get_last()는 그것을 반환합니다. 더 나아가 메시지 앞에 하드 코드 된 FATAL:을 넣기 만하면됩니다. 다른 유형의 오류, 경고 및주의 사항을 여기에서 처리해야합니다.

문제는 종료 기능이며 fsockopen()이 아닙니다. 셧다운 기능은 다음과 같아야합니다

register_shutdown_function(function() { 
    $error = error_get_last(); 
    if($error && $error['type'] === E_ERROR) { 

     $errno = $error["type"]; 
     $errfile = $error["file"]; 
     $errline = $error["line"]; 
     $errstr = $error["message"]; 

     errorHandler($errno, "FATAL: " . $errstr, $errfile, $errline /* , ... */); 
    } 
}); 

원래 대답

당신은 PHP stops execution with FATAL ERROR 있다고 말했다.

이것은 사실이 아닙니다. fsockopen는 false를 반환하고 오류가 발생하는 경우에 경고를 발생합니다 : 당신은 치명적인 오류가 발생하는 경우

// sorry example.com ;) 
var_dump(fsockopen("www.example.com", 1000, $errno, $errstr, 3)); 

PHP Warning: fsockopen(): unable to connect to www.example.com:1000 (Connection timed out) in /home/thorsten/src/checkout-plugin/a.php on line 3 PHP Stack trace: PHP 1. {main}() /home/thorsten/src/checkout-plugin/a.php:0 PHP 2. fsockopen() /home/thorsten/src/checkout-plugin/a.php:3 bool(false)

이이 set_error_handler() 및 회전을 사용하여 등록 된 전역 오류 핸들러에 의해 발생할 수 있습니다 (!) 예외에 대한 경고. 일부 프레임 워크는 그렇게하고 있습니다. 이것이 사실이라면 "묵음"연산자 @을 사용하여 경고를 표시하지 않을 수 있습니다.

var_dump(@fsockopen("www.example.com", 1000, $errno, $errstr, 3)); 
// bool(false) 
+0

나는 두려워요. 프레임 워크를 사용하지 않고 set_error_handler 및 register_shutdown_function과 같은 내 자신의 프로 시저로 오류를 잡습니다. fscockopen() : 192.168.0.154:80 (연결 시간 초과)에 연결할 수 없습니다. ** – user3523426

+0

@를 시도해 보셨습니까? – hek2mgl

+0

오류 처리기의 코드를 표시 할 수 있습니까? – hek2mgl

관련 문제