5

サイトで発生している「ソケットを開けませんでした」というエラーを軽減するにはどうすればよいですか?

CAPTCHAであるというトラブルシューティングを行いました ( reCAPTCHAを使用しています)。このエラーは、reCAPTCHA を使用している 2 つのページでのみ表示されます。

私は新しいキーのセットを生成してきましたが、機能する場合と機能しない場合があります。たとえば、Safariでは動作する場合もあれば、動作しない場合もありますが、Firefox では動作し、その逆もありました。また、パートナーの 1 人ではなく、私では動作し、その逆も同様でした。

この問題を解決するにはどうすればよいですか? サーバーで fsocketopen コマンドを実行する際に問題が発生している可能性がありますか? もしそうなら、どうすれば修正できますか?

4

1 に答える 1

10

サーバーで fsocketopen コマンドを実行する際に問題が発生している可能性がありますか?

その通りですが、必ずしもサーバーに問題があるとは限りません。サーバーと recaptcha サーバーの間のどこかに、ソケット接続を開くのを妨げるネットワーク通信の問題があることを意味します。

これには多くのことが考えられます。コードまたはサーバーの構成の問題である可能性があります (特に、サーバーの構成に動的な側面がある場合)。サーバーの接続レベルの問題である可能性があり、ネットワーク構成である可能性があります。サーバーがホストされている場所の問題、サーバーとrecaptchaサーバー間のネットワーク構成の問題、ホストされている帯域幅の問題、サーバー側の構成の問題である可能性があります. 追加のエラー報告引数を使用しfsockopenて、意味のあるメッセージを取得できるかどうかを確認することをお勧めします。また、まったく異なるネットワーク上の少なくとも 2 ~ 3 台の異なるサーバーでセットアップを試すこともできます。これにより、問題がどこにあるかについてある程度具体的な兆候が得られる可能性もあります。

しかし、もう 1 つの問題は、この種のことを一般的にどのように管理するかということです。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 に答える