現在の位置: ホーム> 最新記事一覧> Stream_set_timeoutがデフォルトのソケットタイムアウト設定と競合するのはなぜですか?それを避ける方法は?

Stream_set_timeoutがデフォルトのソケットタイムアウト設定と競合するのはなぜですか?それを避ける方法は?

gitbox 2025-09-17

Stream_set_timeoutがデフォルトのソケットタイムアウト設定と競合するのはなぜですか?それを避ける方法は?

PHPを使用してネットワークをプログラミングする場合、 Stream_set_timeoutは非常に便利な機能であり、ストリームのタイムアウトを設定できます。ただし、場合によっては、開発者はStream_set_timeoutを介してタイムアウトを設定しますが、ネットワーク操作は予想される時間にタイミングを出さないようであり、競合さえあるようです。この現象の発生は、多くの場合、PHPでのデフォルトのソケットタイムアウト設定に関連しています。

1。どのようにStream_set_timeoutが機能するか

Stream_set_timeout関数は、ストリームのタイムアウト(ファイル、ソケットなど)のタイムアウトを設定するために使用されます。この関数を通じて、開発者はストリームの最大待ち時間を指定できます。通常、タイムアウトは読み取り操作または書き込み操作用です。設定されたタイムアウト時間内に操作が完了しない場合、PHPはタイムアウトメカニズムをトリガーし、 falseを返します。

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続に失敗しました: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);  </span><span><span class="hljs-comment">// タイムアウト時間を設定します 5 2番</span></span><span>
    </span><span><span class="hljs-comment">// さらなる操作</span></span><span>
}
</span></span>

上記のコードでは、 Stream_set_Timeout($ socket、5)は、ソケットストリームのタイムアウトを5秒に設定します。つまり、5秒以内に有効な読み取りまたは書き込み操作が実行されない場合、ストリームはタイムアウトと見なされます。

2。デフォルトのソケットタイムアウト設定の影響

ただし、 Stream_set_timeoutは、ストリームのタイムアウト設定のみを変更できますが、PHPのデフォルトソケットタイムアウト設定(通常はdefault_socket_timeout configurationディレクティブで決定)で相互の影響を与えます。 default_socket_timeoutは、すべてのソケット操作のデフォルトのタイムアウトを設定するPHP構成ファイルのパラメーターです。このデフォルト値は、タイムアウトが明示的に設定されていない場合に使用されます。

 <span><span><span class="hljs-comment">; php.ini ファイル内のデフォルト値</span></span><span>
</span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">60</span></span><span>
</span></span>

default_socket_timeoutを変更していない場合、デフォルト値は60秒です。この場合、PHPはこのグローバルタイムアウトを使用して、 stream_set_timeoutを介して別のタイムアウトを設定した場合でも、すべてのソケット操作を管理します。指定された時間内にストリーム操作が完了しない場合、 default_socket_timeoutはstream_set_timeoutの設定をオーバーライドし、異常なプログラムの動作を引き起こす可能性があります。

3.なぜ紛争が発生するのですか?

PHPのソケット操作は、Socket_set_option()を介して基礎となるソケット構成を実際に設定するため、 Stream_set_timeoutによって設定されたタイムアウトとdefault_socket_timeoutのタイムアウトとの間に競合があります。 Stream_set_timeoutは、デフォルトのソケットタイムアウト設定がグローバルである一方で、ストリームを介してタイムアウトを設定するために使用されます。

場合によっては、 Stream_set_Timeoutはストリームのタイムアウトを正常に変更できますが、 default_socket_timeoutStream_set_timeoutよりも長く設定されている場合、PHPはSocket_set_optionを内部的に呼び出すときにグローバルに構成されたタイムアウト値を使用し、 Stream_set_timeoutの設定が無効になります。

4.紛争を避ける方法は?

この競合を回避するために、最良の方法は、 default_socket_timeoutstream_set_timeout設定の一貫性を確保することです。次の方法をとることができます。

  1. default_socket_timeout Configuration <br>を調整します PHP.ini構成ファイルのdefault_socket_timeoutが、コードで設定したstream_set_timeoutと一致していることを確認してください。より短いタイムアウトを使用する場合は、その値をphp.iniでより小さな値に設定できます。

     <span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>
    </span></span>
  2. 明示的にタイムアウトを設定します<br> Stream_Socket_Client()またはその他のネットワークストリーミング操作を使用するたびに、Timeoutが正確であることを確認するために、 Stream_set_timeout()を明示的に呼び出します。

     <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続に失敗しました: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);  </span><span><span class="hljs-comment">// タイムアウトがあることを確認してください 5 2番</span></span><span>
        </span><span><span class="hljs-comment">// さらなる操作</span></span><span>
    }
    </span></span>
  3. stream_context_createを使用して、ストリームのタイムアウトを構成<br> 別の方法は、 stream_context_createを介してストリームコンテキストを作成し、コンテキストでタイムアウトを設定することです。これにより、ソケットのタイムアウトを設定するだけでなく、他のストリーム関連の構成も処理します。

     <span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
        </span><span><span class="hljs-string">'socket'</span></span><span> =&gt; [
            </span><span><span class="hljs-string">'timeout'</span></span><span> =&gt; </span><span><span class="hljs-number">5</span></span><span>
        ]
    ]);
    </span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
    </span></span>

これらの方法により、 Stream_Set_TimeOutによって設定されたタイムアウトがPHPデフォルトソケットタイムアウトと競合しないようにして、一貫性のないプログラムの動作を回避できます。

5。概要

stream_set_timeoutは、PHPのストリームのタイムアウトを設定するための強力な関数です。ただし、それを使用する場合は、Flowのタイムアウト動作に影響を与える可能性があるため、PHPのデフォルトソケットタイムアウト設定( default_socket_timeout )に注意する必要があります。構成ファイルでDefault_Socket_Timeoutを調整するか、コードのタイムアウトを明示的に設定することにより、これらの競合を回避し、予想されるタイムアウトでネットワーク操作を実行できるようにすることができます。