0

私はこのPHPコードを持っています:

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

その「60」は接続のタ​​イムアウトです。その行の直後に、私は持っています:

if (!$fp) {...}

今:この行は、中括弧内のコードを実行する前に、そのタイムアウト時間待機しますか?

4

1 に答える 1

2

中括弧内のコードは、stream_socket_client()returnsの呼び出し後に実行されます。次の3つの方法のいずれかで戻ります。

  • 接続は成功しました(ソケットを返します)
  • 接続が明示的に失敗する-IE接続がサーバーによって拒否またはリセットされる
  • 接続は暗黙的に失敗します-IEはタイムアウトします

最初の2つのオプションは、最大で2、3秒以内に発生する可能性があります。10秒以内に接続を確立しないと、正しく機能しないと合理的に想定できます。現在のコードでは、3番目のオプションは60秒間発生しません。つまり、そのコードが実行されるまで60秒間待機することになります。

これは通常、PHPのほとんどすべての関数に当てはまります。次の関数を実行する前に、1つの関数の実行が完了するのを待つ必要があります。このルールにはいくつかの例外があります-これらの例外の多くはソケットプログラミングの領域にあり、これらは「非ブロッキング」操作と呼ばれます-しかし、接続されるまでソケットを非ブロッキングに設定することはできません1。これは、接続または失敗するまで、接続呼び出しが常に「ブロック」されることを意味します。中括弧内のコードは、ソケットが接続に失敗するまで実行できず、最大60秒かかる場合があります。

このタイムアウトを短くすることをお勧めします-60秒は不必要に長いです。

編集

1STREAM_CLIENT_ASYNC_CONNECT実際には、のフラグを使用して、非ブロッキング方式で接続操作を実行できますstream_socket_client()。このフラグを使用stream_select()する場合は、ソケットが接続されているかどうか/いつ接続されているかを判断するために使用する必要があります。

于 2011-12-23T14:03:59.350 に答える