配列が PHP の本質である場合、配列を扱えないのであれば、PHP をまったく使用できるとは言えません。 Swoole のコルーチンも同様で、コルーチンを理解せずに Swoole を使用すると、やみくもに使用することになります。
まず第一に、Swoole はコマンド ライン (Cli) モードでのみ実行できるため、開発とデバッグには php-fpm/ の代わりにコマンド ラインを使用します。 apache
待ってください。
Swoole では、`\Swoole\Coroutine::create()`
を使用してコルーチンを作成するか、省略形 `go()` を使用することもできます。
Swoole コルーチンの最初の紹介
go(function(){ go(function(){ echo 0, PHP_EOL; }); echo 1, PHP_EOL; }); go(function(){ echo 2, PHP_EOL; }); go(function(){ echo 3, PHP_EOL; });
実行結果:
0 1 2 3
Swoole コルーチンと同期モードの比較
Swoole コルーチンは I/O 集中型のシナリオに適していると述べてきましたが、同じハードウェア構成環境下では、従来の同期モードよりも多くのアクセスを実行できます。
私たちがよく知っているファイルの読み取りと書き込み、およびネットワーク通信リクエスト (MySQL、Redis、HTTP など) は、すべて I/O 集中型のシナリオです。
SQL クエリに 100 ミリ秒かかると仮定します。従来の同期モードでは、現在のプロセスはこの 100 ミリ秒の間、他の操作を実行できません。この SQL を 10 回実行すると、1 秒以上かかる場合があります。
コルーチンを使用する場合、異なるコルーチンが順番に実行されますが、前の 100 ミリ秒の待機期間中に、最下層は CPU が他のコルーチンの操作を実行するようにスケジュールします。つまり、最初のクエリが結果を返す前に、他のいくつかのクエリが MySQL に送信され、実行されている可能性があります。 10 個のコルーチンが開かれ、この SQL が個別に実行される場合、完了までにかかる時間はわずか 100 ミリ秒です。
テストコードは次のとおりです:
Swoole\Runtime::enableCoroutine(); // 开启一键协程化 function work() { $pdo = new \PDO('mysql:host=127.0.0.1;dbname=db_test', 'root', 'root'); $pdo->exec('select SLEEP(0.1)'); // 模拟sql需要执行 100ms 的情况 } $time = microtime(true); for($i = 0; $i < 10; ++$i) { work(); } echo 'time: ', (microtime(true) - $time), 's', PHP_EOL; $time = microtime(true); for($i = 0; $i < 10; ++$i) { go('work'); } swoole_event_wait(); // 等待所有协程执行完 echo 'time: ', (microtime(true) - $time), 's', PHP_EOL;
実行結果:
time: 1.0326268672943s time: 0.10734605789185s
上記のコードは、1つのプロセスが10個のリクエストを処理するのに必要な時間を想像できます。各リクエストでは、100 ミリ秒かかる SQL ステートメントを実行する必要があります。
同期モード、fpm には約 1 秒かかります。 100ms 待機している間は何もできないことがわかります。
コルーチンモデルで0.1秒くらいかかるのがSwooleです。 100 ミリ秒の待機期間中、現在のコルーチンは一時停止され、基礎となるスケジューリングにより CPU が他のコルーチンの操作を実行できるようになります。
以上がSwoole コルーチンと従来の fpm 同期モードの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。