簡體   English   中英

“無法打開插座”

[英]“Could not open socket”

如何緩解我網站上發生的“無法打開套接字”錯誤?

我有麻煩,它是CAPTCHA (我正在使用reCAPTCHA )。 它只在我使用reCAPTCHA的兩個頁面上顯示此錯誤。

我一直在生成新的密鑰集,有時它可以工作,有時則不然。 例如,它適用於Safari ,有時不適用於Firefox ,反之亦然,它適用於我,而不適用於我的合作伙伴之一,反之亦然。

我該如何解決這個問題? 可能是我的服務器在執行fsocketopen命令時遇到了麻煩嗎? 如果是這樣,我該如何解決?

可能是我的服務器在執行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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM