5

如何缓解我网站上发生的“无法打开套接字”错误?

我有麻烦,它是CAPTCHA(我正在使用reCAPTCHA)。它仅在我使用 reCAPTCHA 的两个页面上显示此错误。

我一直在生成新的密钥集,有时有效,有时无效。例如,它在Safari上工作,有时不能,但在Firefox上,反之亦然,它对我有用,而不是对我的一个合作伙伴,反之亦然。

我该如何解决这个问题?会不会是我的服务器在执行 fsocketopen 命令时遇到了问题?如果是这样,我该如何解决?

4

1 回答 1

10

会不会是我的服务器在执行 fsocketopen 命令时遇到了问题?

完全正确——尽管这并不一定意味着您的服务器有问题。这只是意味着在您的服务器和 recaptcha 服务器之间的某个地方,存在阻止打开套接字连接的网络通信问题。

这可能是很多事情。这可能是您的代码或服务器上的配置问题(特别是如果您的服务器上的某些配置方面是动态的),也可能是您的服务器的连接级别有问题,也可能是网络配置您的服务器托管的问题,它可能是您的服务器和recaptcha服务器之间的任何地方的网络配置问题,它可能是它们托管的带宽问题,它可能是他们一方的配置问题。您可能希望使用额外的错误报告参数来fsockopen查看是否可以获得任何有意义的消息。您还可以在完全不同的网络上的至少 2-3 台不同的服务器上尝试您的设置——这也可以为您提供一些关于问题所在的具体指示。

不过,另一个问题是您将如何管理这类事情。fsockopen只是有时无法获得连接,因为即使在配置最好的网络环境中,也没有通信保证。硬件故障,事故发生,网络管理员手忙脚乱,远程服务器混乱,全球热核战争可以摧毁一个数据中心——你永远不知道。因此,您必须编写代码(并管理您的设置),以便在发生故障时获得备用情况,并显示最终用户可以接受的错误消息。

您可能想查看 PHP 的set_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
}
于 2010-07-13T18:20:19.580 回答