現在の位置: ホーム> 最新記事一覧> socket_set_blockingとsocket_get_statusを使用する際のヒントと予防策は何ですか?

socket_set_blockingとsocket_get_statusを使用する際のヒントと予防策は何ですか?

gitbox 2025-09-12

1。Socket_set_blocking ()の役割と使用

socket_set_blocking()関数は、ソケットがブロッキングモードであるかどうかを設定するために使用されます。ブロッキングモードでは、ソケットの読み取りおよび書き込み操作は、データの準備ができるまで待ちます。ブロッキングモードの代わりに、データがない場合、データが到着するのを待つ代わりに、操作はすぐに戻ります。これは、複数のクライアント接続を処理する必要があるサーバーにとって特に重要であり、非ブロッキングモードは、1つの接続のブロックによりプログラム全体がぶら下がっていないことを防ぐことができます。

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$blocking</span></span><span> )
</span></span>
  • $ソケット:ソケットリソース。

  • $ブロッキングTrueの場合、ソケットはブロッキングモードです。 falseの場合、ソケットは非ブロッキングモードです。

たとえば、ソケットを非ブロッキングモードに設定します。

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>

2。socket_get_status ()の役割と使用

socket_get_status()関数は、ブロッキングモードであるかどうか、ソケットが閉じられているかどうかなど、現在のソケットのステータス情報を取得するために使用されます。次のフィールドを含む関連配列を返します。

  • ブロック:ブロッキングモードであるかどうか、1はブロッキングを意味し、0は非ブロックを意味します。

  • EOF :ファイルエンドフラグに到達したかどうか(接続が閉じられている場合)。

  • エラー:現在のソケットのエラーコード。

  • errorStr :現在のソケットのエラーメッセージ。

 <span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>

例として、ソケットのステータスを取得します。

 <span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</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">"Blocked: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"EOF: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>

3。組み合わせのヒントと予防策

socket_set_blocking()socket_get_status()を組み合わせることで、特に同時接続を処理する場合、より柔軟で効率的なネットワーク通信を実現できます。使用する際のヒントと予防措置は次のとおりです。

(1)ブロッキングモードを設定および確認します

場合によっては、ソケットのブロッキングモードを動的に切り替える必要があります。たとえば、ネットワーク要求の処理の場合、ソケットの読み取りデータがブロックモードの場合、ネットワークが良好な状態にない場合、またはデータの準備ができていない場合、プログラム全体がハングする可能性があります。この時点で、 socket_set_blocking()を介して非ブロッキングモードに切り替えてから、 socket_get_status()を介してソケットのステータスを確認して、ブロッキングを避けます。

例えば:

 <span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] == </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ソケットは、非ブロッキングモードになりました。\n"</span></span><span>;
}
</span></span>
(2)非ブロッキングモードでのパフォーマンスの最適化

ソケットが非ブロッキングモードの場合、読み取るデータがない場合でも、 socket_read()などの機能はすぐに返されます。繰り返される意味のない呼び出しを避けるために、 socket_get_status()をsocket_get_status()と組み合わせて、現在のソケットがデータを読み取ったかどうか、それともEOFに達したかどうかを判断できます(ファイルの終わり)。

 <span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
    </span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
        </span><span><span class="hljs-keyword">break</span></span><span>; </span><span><span class="hljs-comment">// 読み取るデータはありません</span></span><span>
    }
    </span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-comment">// 読み取りエラーを処理します</span></span><span>
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
    </span><span><span class="hljs-variable">$data</span></span><span> .= </span><span><span class="hljs-variable">$buffer</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"データを読む: <span class="hljs-subst">$data</span></span></span><span>\n";
</span></span>

上記のコードを通じて、EOFがリアルタイムで到達されるかどうかを判断し、不必要な繰り返し測定値を避けることができます。

(3) socket_get_status()を使用して、接続ステータスを確認します

socket_get_status()は、ブロッキングステータスをチェックするだけでなく、ソケットに関する他の重要な情報を理解するのにも役立ちます。たとえば、ソケットが閉じられているか(EOFフラグ)か、エラーが発生したかどうかを判断するために使用できます。

 <span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続が閉じられています。\n"</span></span><span>;
}
</span></span>
(4) socket_get_status()を頻繁に呼び出さないでください

socket_get_status()はソケットのステータスをリアルタイムで取得できますが、この関数をあまりにも頻繁に呼び出すと、パフォーマンスが頭上につながる可能性があります。したがって、高い並行性環境では、不必要な状態チェックを避けるために、コール頻度が合理的に制御されます。

(5)例外処理とエラーチェック

これら2つの機能を使用する場合、特にソケット操作( socket_read()など)を実行する場合は、エラー処理を実行する必要があります。ソケットの操作は、ネットワークの問題やその他の理由により失敗する可能性があるため、実際に使用する場合は、適切なエラー処理ロジックを追加する必要があります。

 <span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-variable">$error_code</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</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></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$error_code</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>

4。概要

socket_set_blocking()およびsocket_get_status()を使用すると、ブロッキングによって引き起こされるパフォーマンスのボトルネックを避けるために、ソケットステータス情報を効果的に制御および取得できます。実際の開発では、ブロッキングモードを合理的に設定し、EOFとエラーステータスを判断することにより、プログラムの応答速度と堅牢性を改善できます。ただし、州のチェック機能への頻繁な呼び出しがパフォーマンスに影響を与える可能性があるため、過度の呼び出しを避けるために適切な時間にチェックを行う必要があります。

これら2つの機能を合理的に使用すると、同時接続を処理する柔軟性と効率を大幅に向上させると、PHPネットワーク通信アプリケーションがより安定して効率的になります。