Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当无法访问主机时,fsockopen会导致致命错误-“;无法连接到";_Php_Fsockopen - Fatal编程技术网

Php 当无法访问主机时,fsockopen会导致致命错误-“;无法连接到";

Php 当无法访问主机时,fsockopen会导致致命错误-“;无法连接到";,php,fsockopen,Php,Fsockopen,当我将fsockopen调用到一个不可访问的IP地址时,PHP会停止执行,并出现致命错误,正如它打算做的那样。但对我来说,这是正常的情况,无法联系到一位主人。如果这是预期的行为,有没有一种方法,如何防止在发生致命错误的情况下停止php 我不使用任何框架,我自己处理所有错误。我像这样注册处理程序: set_error_handler("errorHandler"); register_shutdown_function("fatalErrorHandler"); function fatalEr

当我将fsockopen调用到一个不可访问的IP地址时,PHP会停止执行,并出现致命错误,正如它打算做的那样。但对我来说,这是正常的情况,无法联系到一位主人。如果这是预期的行为,有没有一种方法,如何防止在发生致命错误的情况下停止php

我不使用任何框架,我自己处理所有错误。我像这样注册处理程序:

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;
}
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 /* , ... */);
    }   
});
处理程序的定义如下:

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;
}
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 /* , ... */);
    }   
});
函数fatalErrorHandler()
{
$error=error_get_last();
如果($error!==NULL){
$errno=$error[“type”];
$errfile=$error[“file”];
$errline=$error[“line”];
$errstr=$error[“message”];
errorHandler($errno,“致命:”。$errstr,$errfile,$errline,get_defined_vars(),debug_backtrace());
}
} 
函数errorHandler($errno、$errstr、$errfile、$errline、$vars、$trace=”“)
{
//一些格式化和检查
文件内容(dirname(uuu file_uuu)。“/error/”.gmdate(“YmdHis”).str_replace(“.”,“”,microtime(true))。.err”
,“”.gmdate(“YmdHis”)。“{$uid}
{$errstr}
{$errfile}
{$errline}
{$vars}
{$trace}”);
返回true;
}

编辑问题后的最终答案

您不知道,不管是否发生错误,都会在脚本末尾调用shutdown函数。即使只是一个警告没有立即停止脚本,error\u get\u last()也会返回它。此外,您只需在消息前面添加硬编码的
致命:
。您应该在此处处理不同类型的错误、警告和通知

问题在于关机功能,而不是
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;
}
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停止执行时出现致命错误

事实并非如此
fsockopen
将返回false,并在出现错误时抛出警告(!):

// sorry example.com ;)
var_dump(fsockopen("www.example.com", 1000, $errno, $errstr, 3));
PHP警告:fsockopen():无法连接到第3行/home/thorsten/src/checkout plugin/a.PHP中的www.example.com:1000(连接超时) PHP堆栈跟踪: PHP1。{main}()/home/thorsten/src/checkout-plugin/a.php:0 PHP2。fsockopen()/home/thorsten/src/checkout插件/a.php:3 布尔(假)

如果出现致命错误,这可能是由于使用
set\u error\u handler()
注册了全局错误处理程序,并将警告转化为异常而导致的。一些框架正在这样做。如果这是真的,您可以使用“静音”操作符
@
来抑制警告:

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

恐怕情况并非如此。我不使用框架,我用自己的过程捕捉错误-设置错误处理程序和注册关闭函数。我的fscokopen触发register\u shutdown\u函数事件和error\u get\u last()返回:致命:fsockopen():无法连接到192.168.0.154:80(连接超时)是的,我尝试了。我的处理程序注册码是:`set_error_handler(“errorHandler”);寄存器关闭功能(“fatalErrorHandler”)`函数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())}不在这里。编辑问题。重要的是
返回true在error handler函数errorHandler($errno,$errstr,$errfile,$errline,$vars,$trace=“”){//这里是一些格式化和检查文件内容(..);if(error_reporting()>0)echo(“error:[{$errfile}:{$errline}]{$errstr}”);返回true;}