1. ホーム
  2. php

[解決済み] "ソケットを開くことができませんでした"

2022-02-03 03:35:38

質問

私のサイトで発生する "Could not open socket" エラーを軽減するにはどうすればよいですか?

トラブルシューティングの結果、原因は キャプチャ(CAPTCHA (私が使っているのは reCAPTCHA ). reCAPTCHAを使用している2つのページでのみ、このエラーが表示されます。

新しいキーセットを生成していますが、うまくいくときといかないときがあります。例えば サファリ であったり、そうでなかったりしますが ファイアフォックス 私はうまくいったのですが、私のパートナーの一人はうまくいかず、その逆もまたしかりでした。

どうすればこの問題を解決できますか?私のサーバーが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
}