この記事では、PHP の 5 つの主要な IO モデルのブロッキングとノンブロッキングについて詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
ブロッキング: アプリケーションがユーザー空間に戻る前に IO 操作を完了する必要があることを意味します。 IO 操作の実行時にブロックされます。ステータス値は、IO 操作が完全に完了するのを待たずに、呼び出し直後にユーザーに返されます。
ブロッキング モデル:
ノンブロッキング モード:
ブロッキング モードでは、ユーザーはプロセスはカーネル状態データを待ち続けるため、効率が非常に低くなります。たとえば、シャオミンが水を沸騰させたいとき、水が沸騰するまで待たなければなりませんが、実際には、シャオミンは水を沸騰させる過程で他のことをすることができます。
最適化はノンブロッキング モードです。ユーザー プロセスが IO 操作を実行すると、カーネル状態はすぐに値を返しますが、通常は空です。ユーザー プロセスは、カーネル状態データが返されるまで他のことを行うことができます。実際の実行結果の取得をリクエストします。上記のシャオミンの例で言えば、シャオミンは水を沸騰させているとき、本を読み、水が沸騰しているかどうかをしばらく見て、水が沸騰しているかどうかを確認し、同時に本を読むことができますそして勉強。
パフォーマンス分析:
プログラムが 2 つの操作 a と b を実行する必要があり、a は IO 操作を実行する必要があり、b は実行しないとします。ブロッキング モードでは、消費時間は a b に等しくなりますが、非ブロッキング モードでは、a と b の最大時間消費操作に等しくなります。
サーバー コード:
$server = stream_socket_server('tcp://127.0.0.1:9999', $erron, $error); while (true) { $conn = stream_socket_accept($server); if ($conn) { $data = fread($conn, 65535); echo $data; sleep(3); fwrite($conn, 'this is server'); fclose($conn); } }
ブロッキング クライアント:
function operation() { sleep(2); } echo "client start n"; $client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60); fwrite($client, "is client 1n"); echo fread($client, 65535); operation(); fclose($client);
非ブロッキング クライアント:
function operation() { sleep(2); } echo "client start n"; $client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60); stream_set_blocking($client, 0);//设置非阻塞 fwrite($client, "is client 1n"); operation(); while (!feof($client)) { sleep(1); var_dump(fread($client, 65535)); } fclose($client);
時間消費:
ブロッキング モード
ノンブロッキング モード
推奨学習:
php ビデオ チュートリアル以上がPHP の 5 つの IO モデルの詳細な紹介: ブロッキングとノンブロッキングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。