私はこのPHPコードを持っています:
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
その「60」は接続のタイムアウトです。その行の直後に、私は持っています:
if (!$fp) {...}
今:この行は、中括弧内のコードを実行する前に、そのタイムアウト時間待機しますか?
私はこのPHPコードを持っています:
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
その「60」は接続のタイムアウトです。その行の直後に、私は持っています:
if (!$fp) {...}
今:この行は、中括弧内のコードを実行する前に、そのタイムアウト時間待機しますか?
中括弧内のコードは、stream_socket_client()
returnsの呼び出し後に実行されます。次の3つの方法のいずれかで戻ります。
最初の2つのオプションは、最大で2、3秒以内に発生する可能性があります。10秒以内に接続を確立しないと、正しく機能しないと合理的に想定できます。現在のコードでは、3番目のオプションは60秒間発生しません。つまり、そのコードが実行されるまで60秒間待機することになります。
これは通常、PHPのほとんどすべての関数に当てはまります。次の関数を実行する前に、1つの関数の実行が完了するのを待つ必要があります。このルールにはいくつかの例外があります-これらの例外の多くはソケットプログラミングの領域にあり、これらは「非ブロッキング」操作と呼ばれます-しかし、接続されるまでソケットを非ブロッキングに設定することはできません1。これは、接続または失敗するまで、接続呼び出しが常に「ブロック」されることを意味します。中括弧内のコードは、ソケットが接続に失敗するまで実行できず、最大60秒かかる場合があります。
このタイムアウトを短くすることをお勧めします-60秒は不必要に長いです。
編集
1STREAM_CLIENT_ASYNC_CONNECT
実際には、のフラグを使用して、非ブロッキング方式で接続操作を実行できますstream_socket_client()
。このフラグを使用stream_select()
する場合は、ソケットが接続されているかどうか/いつ接続されているかを判断するために使用する必要があります。