インターネット アプリケーションの継続的な開発に伴い、高い同時実行性がすべての開発者にとって直面しなければならない課題となっています。高い同時実行性に対処するために、フロントエンドの学生はフロントエンド ディスプレイや非同期 I/O などのテクノロジを使用し、バックエンドの学生はコルーチンや非同期プログラミング テクノロジを使用します。その中でも、Swoole は PHP 言語のコルーチン フレームワークであり、コルーチンと非同期プログラミングのアイデアを使用して、高い同時実行性の下での開発とデバッグを簡素化し、開発者により良い開発エクスペリエンスを提供します。
1. コルーチンと非同期プログラミングの概念
コルーチンの理解は、スレッドと似た概念である「マイクロスレッド」として簡単に理解できますが、スレッドの切り替えとは異なります。機構。コルーチンはオペレーティング システム カーネルのスレッドではありませんが、ユーザー プロセス内で切り替えられます。コルーチンを使用すると、CPU 使用率を向上させ、コンテキスト スイッチの数を減らしながら、ノンブロッキング待機を実行できます。
非同期プログラミングは「イベント駆動型」のプログラミング手法であり、その主な特徴はノンブロッキング I/O を使用することで、I/O ブロック待機によるスレッドの待ち時間を回避し、スレッドの処理量を増加させることです。同時並行性。非同期プログラミングでは、イベントが完了すると、プログラムはスレッドをブロックして待機させるのではなく、関連するスレッドに処理を続行するように通知します。非同期プログラミングでは、コールバックを使用して非同期操作を処理し、コルーチン間の切り替えを処理し、プログラムの同時処理能力を向上させます。
2. Swoole のコルーチンと非同期プログラミングの実践
Swoole コルーチンは、PHP 言語環境でプロセスをシミュレートおよび実装します。また、スレッド内のコルーチン メカニズムも同様です。 。 Swooleのコルーチンでは、コルーチンスケジューラを利用してPHPの実行制御をコルーチンに引き渡すことで、I/Oブロック待ちによるスレッド待ち時間を回避し、動作効率を向上させることができます。コルーチンは、swoole_coroutine_create() 関数と swoole_coroutine_resume() 関数を使用してコルーチン間の切り替えを実現します。同時に、Swoole は swoole_event_add()、swoole_event_set() などのイベント駆動型関数を提供し、コルーチン プログラミング モデルを大幅に簡素化します。
以下では、コードの練習を通じて Swoole コルーチンの使用法を段階的に理解していきます。
1) Swoole 拡張機能のインストール
まず、Swoole コルーチンの開発を実現するために、Swoole 拡張機能をインストールする必要があります。 Swoole 拡張機能は、次のコマンドでインストールできます:
$ pecl install swoole
2) コルーチンを作成する
次に、コルーチンを作成し、swoole_coroutine_resume() 関数を使用してコルーチンを実行する必要があります。具体的なコードは次のとおりです。
<?php function test_coroutine(){ echo "Start coroutine "; swoole_coroutine::sleep(1); echo "End coroutine "; } swoole_coroutine::create("test_coroutine"); echo "Main func end ";
コード内で swoole_coroutine_create() 関数がコルーチンを作成するために使用され、test_coroutine() 関数が渡されていることがわかります。この時点ではコルーチンはまだ実行されていないため、 swoole_coroutine_create() を呼び出した後、システムはコルーチンをコルーチン スケジューラに送信し、実行を待ちます。次に、swoole_coroutine_resume()関数を呼び出すと、test_coroutine()関数が実行され、結果が出力されます。
3) コルーチン間の切り替え
コルーチンでは、swoole_coroutine_yield() 関数を使用してコルーチンを手動で切り替えることもできます。具体的な実装コードは次のとおりです。
<?php function test_coroutine(){ for ($i=0; $i<5; $i++){ echo "Coroutine $i "; swoole_coroutine::yield(); } } $c = swoole_coroutine::create("test_coroutine"); for ($i=0; $i<5; $i++){ swoole_coroutine::resume($c); }
上記のコードにより、コルーチンを作成し、test_coroutine() 関数を 5 回ループしてコルーチン番号を出力します。 swoole_coroutine_yield() 関数を使用して手動でコルーチンを切り替え、複数のコルーチンを公平に処理できるようにします。
Swoole の非同期プログラミングは、主に、woole_event_add()、swoole_event_set()、swoole_event_wait() などのイベント駆動関数に基づいて実装されます。具体的には、woole_event_add() 関数と swoole_event_set() 関数は I/O イベントをイベント ループに追加するために使用され、swoole_event_wait() 関数はイベント ループを開始するために使用されます。
以下では、コードを通して Swoole の非同期プログラミングの実践を段階的に理解していきます。
1) Swoole 拡張機能をインストールします
まず、Swoole 非同期プログラミングの開発を実現するために、Swoole 拡張機能をインストールする必要があります。 Swoole 拡張機能は、次のコマンドを使用してインストールできます。
$ pecl install swoole
2) 非同期 TCP 通信
Swoole では、swoole_client および swoole_server を通じてシステム間の非同期 TCP 通信をサポートできます。非同期 TCP 通信では、SwooleServer を使用して TCP サービスを開始し、サーバー側で swoole_event_add() 関数を使用して I/O イベントをサービスに追加する必要があります。メッセージ送信者は swoole_client を使用して非同期通信を実装します。具体的な実装コードは次のとおりです。
<?php //异步TCP服务端 $serv = new swoole_server("127.0.0.1", 9501); $serv->set(array( 'worker_num' => 4, 'daemonize' => false, )); $serv->on('Receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Server: '.$data); $serv->close($fd); }); $serv->start();
<?php //异步TCP客户端 $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $client->on("connect", function($cli) { $cli->send("hello world "); }); $client->on("receive", function($cli, $data){ echo "Received: ".$data." "; }); $client->on("error", function($cli){ echo "Connect failed "; }); $client->on("close", function($cli){ echo "Connection closed "; }); $client->connect('127.0.0.1', 9501);
上記のコードにより、非同期 TCP 通信の例を実装しました。クライアントがメッセージを送信すると、サーバーはメッセージを受信し、処理結果を返します。
概要:
この記事では主に Swoole コルーチンと非同期プログラミングの実践について説明します。同時実行性の高いインターネット アプリケーションの開発では、非同期プログラミングとコルーチンを使用すると、システムのパフォーマンスが効果的に向上し、開発効率が向上します。 Swoole フレームワークは、優れたコルーチンおよび非同期プログラミングのサポートを提供し、プログラマが効率的な非同期処理とコルーチン スケジューリングを簡単に実装できるようにし、それによってシステムの同時処理能力を向上させます。
以上がSwoole のコルーチンと非同期プログラミングの実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。