难道是我的服务器在执行 fsocketopen 命令时遇到问题?
确实如此——尽管这并不一定意味着您的服务器有问题。这只是意味着您的服务器和验证码服务器之间的某个位置存在网络通信问题,导致套接字连接无法打开。
这可能有很多事情。这可能是您的代码或服务器上的配置问题(特别是如果服务器上的配置的某些方面是动态的),可能是服务器的连接级别问题,也可能是网络配置问题您的服务器托管的问题,可能是您的服务器和验证码服务器之间任何地方的网络配置问题,可能是它们托管的带宽问题,也可能是它们这边的配置问题。您可能想要使用额外的错误报告参数fsockopen
看看您是否能收到任何有意义的消息。您还可以在完全不同网络上的至少 2-3 个不同服务器上尝试您的设置——这也可以为您提供有关问题所在的具体指示。
不过,另一个问题是你将如何处理这种事情。fsockopen
只是有时无法建立连接,因为即使在配置最好的网络环境中,也没有通信保证。硬件故障、事故发生、网络管理员手足无措、远程服务器混乱、全球热核战争可能摧毁数据中心——你永远不知道。因此,您必须编写代码(并管理您的设置),以便在发生故障时有后备情况,并显示最终用户可以接受的错误消息。
您可能想研究一下 PHPset_error_handler
函数并设置一个在出现以下情况时调用的函数fsockopen
失败了。在某些情况下,我喜欢用它来触发异常,如下所示:
function throw_error_exception($number = 0, $str = '',$file = null,$line = null) {
throw new ErrorException($str, 0, $number, $file, $line);
}
set_error_handler('throw_error_exception',E_ALL);
通过该设置,您可以管理fsockopen
连接是这样的:
try {
fsockopen('remote.host.com',8080,$fso_errnum,$fso_errstr,30);
} catch(Exception $e) {
// here you can look at properties/methods of $e, and $fso_* values, and
// figure out what nice error messages you want to display for your users
}