PHPネットワークプログラミングでは、ソケット操作のブロッキングおよび非ブロッキング状態が、プログラムの実行プロセスとパフォーマンスに直接影響します。特に、非同期モデルが同期するために使用されるシナリオでは、関数socket_set_block()が特に重要です。この記事では、この機能に関する非同期モデルにおけるその特定の役割とアプリケーションの例を分析します。
ソケット通信には2つの基本的な作業モードがあります。
ブロッキングモード:読み取り、書き込み、その他の操作が実行されると、データの準備ができていない場合、機能は操作が完了するまでプログラムをブロックします。このモードはプログラムが簡単ですが、高い並行性環境でパフォーマンスのボトルネックを引き起こすのは簡単です。
非ブロッキングモード:操作はすぐに戻ります。データの準備ができていない場合、エラーまたは特定のステータスコードが返されます。このプログラムは、非同期イベント駆動型モデルに適した他のタスクを引き続き実行できます。
PHPでは、これら2つの状態をsocket_set_block()およびsocket_set_nonblock()から切り替えることができます。
非同期モデルでは、プログラムは操作が完了するのを待つのではなく、リソースを効率的に利用できるイベントループまたはコールバックメカニズムを介してデータを処理しますが、プログラミングの複雑さを高めます。多くの場合、プログラムのロジックを簡素化するために、開発者は「人為的に」非同期行動を特定のステップで同期実行に変換するため、ブロッキングメカニズムを介して結果を待つ必要があります。
この時点で、 socket_set_block()が重要な役割を果たします。
ソケットが非ブロッキング(非同期)であると仮定します。つまり、読み取りおよび書き込み操作を呼び出すと、データを待つことなく、すぐに戻ります。操作を同期して実行したい場合、つまり「ブロッキングと待機」、 socket_set_block()を呼び出す必要があります。
socket_set_block($socket);
これにより、ソケットをブロッキングモードに切り替え、その後の読み取りおよび書き込みコールは、操作が完了またはタイムアウトするまで待機します。このように、プログラムは「同時実行」であるように見え、非同期から同期への移行を実現します。
データの準備ができるまでプログラムを一時停止します。たとえば、 socket_read()を呼び出すと、データが受信されるまでブロックされ、「空の読み取り」が防止されます。
制御プロセスを簡素化します。イベントループやコールバックは必要ありません。シーケンシャルロジカルコードを簡単に記述できます。
同期相互作用を確実にします:確認手順が完了するシナリオ(握手、認証など)でより信頼性が高くなります。
以下は、単純なTCPクライアントを示しています。最初に非ブロッキング接続を設定し、ブロックモードに切り替えてサーバーの応答を読み取り、非同期接続の同期データの読み取りの変換を実現します。
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
$host = 'gitbox.net';
$port = 8080;
// 非同期接続の試行
@socket_connect($socket, $host, $port);
// 接続が完了するのを待ちます(回路図,より厳密に処理する必要があります)
$write = [$socket];
$except = null;
$read = null;
if (socket_select($read, $write, $except, 5) > 0) {
// ブロッキングモードに切り替えます,同期読み取りの準備
socket_set_block($socket);
// データを同期して読んでください
$data = socket_read($socket, 2048);
echo "Received: " . $data;
} else {
echo "Connection timeout or failed.";
}
socket_close($socket);
?>
ここでは、 socket_set_block()は、 Socket_read()が空の読み取りを避けるためにサーバーがデータを送信するのを待つことを保証します。
非同期から同期モデルでは、 socket_set_block()は主にソケットの作業モードを切り替え、非ブロッキング非同期コールをコンバッキングして同期コールをブロックするために使用されます。開発者は、特に結果を待つ必要がある場合に特定の段階で役立つ場合に、ネットワーク相互作用ロジックを簡素化するのに役立ちます。
ただし、ブロッキングモードはプログラムの実行を一時停止し、パフォーマンスと応答性に影響する可能性があることに注意してください。したがって、ネットワークアプリケーションを設計する場合、特定のニーズに応じてブロッキングまたは非ブロッキングモデルを合理的に選択する必要があります。