2

fsockopen()を使用して、Seleniumサーバーが実行されているかどうかを確認しようとしています。サーバーが稼働しているときは、定数を設定する必要があります。そうでない場合、定数は設定されません。これは、次のコードを使用して行われます。

if(!defined('TEST_SELENIUM')){
    $fp = @fsockopen('localhost', 4444);
    if ($fp !== false) {
        define('TEST_SELENIUM', true);
        fclose($fp);
    }
}

この問題は、サーバーが実行されていないときに発生します(Windows 7の場合)。fsockopen()が閉じたポートを見つけてfalseを返すのではなく、ポートとの通信を試みる際に停止します。サーバーが実行されているときは、netstatを使用してすぐに表示されます。サーバーがオフの場合、netstatはポート4444から何も返しません。fsockopen()の私の理解から、これはすぐにfalseを返すはずです。しかし、繰り返しになりますが、ポートとの通信を試みる際に停止します。ここにタイムアウトを追加したくありません。これは、アプリケーション内で何らかのストールが発生する必要があるという点ではないためです。また、これはLinuxで期待したとおりに機能するように見えることに注意してください。ただし、ここWindows 7では失敗しています。私が間違っていることを誰かに教えてもらえますか?どうもありがとうございました!

4

1 に答える 1

3

タイムアウトを追加せずにこれを行うことはできません。これはPHPの実装とは何の関係もありません-まさにTCPソケット接続が機能することになっている方法です。

TCPは確認応答(ACK)を使用してパケットの配信と順序付けを保証するため、TCP接続を開始すると、クライアントはSYNパケットを送信し、SYN/ACKパケットが返されるのを待ちます。クライアントは、この返されたパケットを受信するか、十分に長く待機していると判断してあきらめるまで待機し続けます。これは、fsockopen()受け入れるタイムアウト引数です。

netstatを実行すると、ローカルマシン上のTCPスタックにバインドされているアプリケーションが調べられます。これは、ポートに接続しようとせずに、ポートが使用されているかどうかを判断できることを意味します。その結果、ソケットが使用されているかどうかを即座に報告することができます。

現実的には、ここには2つのオプションがあります。

  • タイムアウトを指定します。タイムアウト引数はfloatである可能性がある(したがって1秒未満である可能性がある)ため、ローカルマシンをチェックしている場合は、これを非常に低く設定できることに注意してください。Windows XPマシンでテストしてみると、0.001(1ms)に設定でき、実行中のサービスに正常に接続されFALSE、バインドされていないポートに戻ります。この1msのタイムアウトは、私の(確かに比較的静かで完全にギガビットの)LAN上の他のマシンでも機能します。YMMVですが、0.005高速ネットワークでは5ms()で十分です。
    たとえば、この行は私にとってはうまく機能し、スクリプトは最大1ミリ秒待機します。
define('TEST_SELENIUM', (bool) @fsockopen('localhost', 4444, $en, $es, 0.001));
  • shell_exec('netstat');出力を解析します。これは確かにローカルマシンをチェックしている場合にのみ機能し、1msのタイムアウトアプローチよりも速くなることはないでしょう。また、さまざまなOSのnetstatユーティリティは、非常にわずかに異なる出力(列の順序、区切り文字の違いなど)を生成する可能性があるため、移植性はあまり高くありません。

fsockopen()また、TCPスタックが、バインドされていないポートに送信されたパケットをアクティブに拒否するように構成されている場合(RSTパケットを返すことにより)、すぐに失敗することにも注意してください。これがおそらくあなたが言う理由ですthis appears to work the way I would expect it should on Linux-あなたがそれをテストしたLinuxインスタンスはこのように構成されました。おそらく、このように動作するようにWindowsを構成できるレジストリ設定がいくつかありますが、頭から離れて、それが何であるかはわかりません。SuperUserのスタッフがそれをお手伝いします。

于 2012-08-23T13:02:16.820 に答える