ホームページ > 記事 > PHPフレームワーク > 従来の fpm 同期モードと swoole コルーチンの違い
まず第一に、Swoole はコマンドライン (Cli) モードでのみ実行できるため、開発とデバッグには php-fpm/apache などではなくコマンドラインを使用します。 Swoole では、`\Swoole\Coroutine::create()`
を使用してコルーチンを作成するか、省略形 `go()` を使用することもできます。
Swoole コルーチンの最初の紹介
実行結果:
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 同期モードと swoole コルーチンの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。