gpt4 book ai didi

php - 当主机无法访问时,fsockopen 会导致 fatal error - "unable to connect to"

转载 作者:行者123 更新时间:2023-12-02 21:28:07 25 4
gpt4 key购买 nike

当我调用 fsockopen 到一个无法访问的 IP 地址时,PHP 停止执行并出现 fatal error ,正如它的预期那样。但对我来说,主机无法访问是正常情况。有没有办法,如果这是预期的行为,如何防止停止 php,即使出现 fatal error ?

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

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;
}

最佳答案

问题编辑后的最终答案

您不知道无论是否发生错误,都会在脚本末尾调用 shutdown 函数。即使这只是一个警告,没有立即停止脚本,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 因 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)

如果遇到 fatal error ,这可能是由使用 set_error_handler() 注册的全局错误处理程序引起的,并将警告转换为异常。一些框架正在这样做。如果这是真的,您可以使用“沉默”运算符@来抑制警告:

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

关于php - 当主机无法访问时,fsockopen 会导致 fatal error - "unable to connect to",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23014090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com