代码之家  ›  专栏  ›  技术社区  ›  LightningWrist

“无法打开套接字”

  •  5
  • LightningWrist  · 技术社区  · 16 年前

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

    我觉得很麻烦 CAPTCHA (我正在使用 reCAPTCHA

    Safari 有时不是,但是 Firefox ,反之亦然,它对我有效,对我的一个合伙人无效,反之亦然。

    1 回复  |  直到 13 年前
        1
  •  9
  •   Weston C    13 年前

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

    没错——尽管这并不一定意味着服务器出了问题。这只是意味着在服务器和recaptcha服务器之间的某个地方,存在一个网络通信问题,阻止了套接字连接被打开。

    这可能是很多事情。这可能是代码或服务器上的配置问题(特别是如果服务器上的某些配置是动态的),可能是服务器的连接级别问题,也可能是服务器所在的网络配置问题,这可能是您的服务器和recaptcha服务器之间的网络配置问题,也可能是它们所在位置的带宽问题,也可能是它们的配置问题。您可能希望使用额外的错误报告参数 fsockopen 看看你是否能得到任何有意义的信息。您还可以在完全不同的网络上的至少2-3个不同的服务器上尝试您的设置——这也可以让您知道问题出在哪里。

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

    您可能想看看PHP的 set_error_handler 函数,并设置要在以下情况下调用的函数 F锁打开 失败。在某些情况下,我喜欢用它来触发异常,比如:

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

    F锁打开

    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
    }