サーバーで 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
}