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