ホームページ  >  記事  >  バックエンド開発  >  PHP7.0におけるノンブロッキングIOの実装方法は何ですか?

PHP7.0におけるノンブロッキングIOの実装方法は何ですか?

王林
王林オリジナル
2023-05-26 08:51:291269ブラウズ

PHP7.0 は、Web 開発やサーバーサイド開発で広く使用されている人気のあるプログラミング言語です。重要なアップデートの 1 つは、ノンブロッキング I/O の導入です。ノンブロッキング I/O は、現在のスレッドをブロックせずに複数の I/O 操作を同時に処理できる非同期プログラミング手法です。この手法により、同時実行パフォーマンスと応答性が大幅に向上します。この記事では、PHP7.0 におけるノンブロッキング I/O の実装について紹介します。

  1. Stream Select

Stream Select は、PHP7.0 の最も単純なノンブロッキング I/O 実装の 1 つです。このメソッドは、select システム コールを使用して、すべてのファイル ストリーム (ストリームは開いているファイル ハンドル、ソケットなどを参照します) に読み取り可能なデータがあるかどうかを確認し、ある場合はデータを読み取ります。このプロセスはノンブロッキングであるため、現在のプロセスはブロックされません。

Stream Select を使用するコードは次のとおりです。

$read = array($fp);
$write = array();
$except = array();
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    die('Error Occured');
} elseif ($num_changed_streams > 0) {
    //有数据可读
    $data = fread($fp, $buffer_size);
} else {
    //无数据可读
}

上記のコードは、まず stream_select 関数を使用して、読み取り可能なデータがあるかどうかを確認し、存在する場合はデータを読み取ります。このチェック プロセスはノンブロッキングであるため、現在のプロセスはブロックされません。

  1. イベント ループ

イベント ループは、PHP7.0 で一般的に使用されるもう 1 つのノンブロッキング I/O 実装です。イベント ループは、イベントの発生時に呼び出されるイベント コールバック関数を登録することで、ノンブロッキング I/O 操作を実装します。イベント ループでは、アプリケーションはイベントを追加し、イベント ループを開始することによって I/O 操作を処理します。たとえば、Web 開発では、イベント ループを使用して HTTP リクエストを処理できます。

以下は、イベント ループを使用して HTTP リクエストを処理する例です:

$loop = ReactEventLoopFactory::create();
$client = new ReactHttpClientClient($loop);

$request = $client->request('GET', 'http://www.example.com/');
$request->on('response', function ($response) {
    $response->on('data', function ($chunk) {
        echo $chunk;
    });
});
$request->end();

$loop->run();

上の例では、最初に ReactPHP に基づくイベント ループ オブジェクト $loop が作成され、次に HTTP クライアントが作成されます。 $client が作成され、GET リクエストが開始されます。リクエストレスポンスのコールバック関数では、受信したデータをechoで出力します。

  1. Coroutine

Coroutine は、PHP7.0 で導入されたもう 1 つのノンブロッキング I/O 実装です。コルーチンはコルーチンの特性を利用して、I/O 操作の処理時に現在のコルーチンを一時停止し、他のコルーチンを実行します。 I/O 操作が完了すると、コルーチンは実行を再開し、次のコードの実行を続行できます。このプロセスはノンブロッキングです。

以下は、Coroutine を使用して I/O 操作を処理する例です。

$server = new SwooleServer("127.0.0.1", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

$server->on('Receive', function ($serv, $fd, $from_id, $data) {
    $result = "";
    $fp = stream_socket_client("tcp://127.0.0.1:80", $errno, $errstr, 30);
    fwrite($fp, $data);
    while (!feof($fp)) {
        $result .= fgets($fp, 1024);
    }
    fclose($fp);
    swoole_coroutine::sleep(0.1);
    $serv->send($fd, $result);
});

$server->start();

上記のコードでは、まず Swoole 拡張機能を使用して TCP サーバー オブジェクト $server を作成します。クライアント データを受信するコールバック関数では、stream_socket_client 関数を使用して HTTP リクエストを開始し、while ループを使用して応答データを読み取ります。データの読み取りプロセス中に、swoole_coroutine::sleep(0.1) を使用して現在のコルーチンの実行を一時停止し、他のコルーチンが実行されるのを待ちます。応答データが正常に読み取られると、データがクライアントに返されます。

結論

PHP7.0 では、ストリーム選択、イベント ループ、コルーチンなどを含む、さまざまなノンブロッキング I/O 実装メソッドが導入されています。これらのテクノロジーにより、PHP アプリケーションは複数の I/O 操作を同時に処理できるようになり、同時実行パフォーマンスと応答速度が向上します。 ReactPHP や Swoole などの多くの PHP フレームワークとライブラリには、これらのノンブロッキング I/O テクノロジが統合されており、開発者が高性能の Web アプリケーションを作成できるようにしています。

以上がPHP7.0におけるノンブロッキングIOの実装方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。