2010-07-12 168 views
5

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

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

我一直在生成新的密钥集,有时它可以工作,有时它不会。例如,它的工作原理是Safari,有时不是,但是在Firefox上,反之亦然,它适用于我而不是我的合作伙伴之一,反之亦然。

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

+5

你的问题是很含糊 - 你可以发布一些代码示例/告诉我们,如果你使用第三方服务,如recaptcha? – 2010-07-12 22:03:49

+0

已编辑@基兰艾伦 – LightningWrist 2010-07-13 18:00:21

回答

7

难道是我的服务器在执行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 
} 
+1

伟大的答案!感谢您花时间! – LightningWrist 2010-07-13 18:32:15

+1

在try子句中,“fsocketopen”应该是“fsockopen” – edt 2012-06-13 17:42:25