ホームページ  >  記事  >  PHPフレームワーク  >  従来の fpm 同期モードと swoole コルーチンの違い

従来の fpm 同期モードと swoole コルーチンの違い

王林
王林オリジナル
2019-12-09 09:28:452589ブラウズ

従来の fpm 同期モードと swoole コルーチンの違い

まず第一に、Swoole はコマンドライン (Cli) モードでのみ実行できるため、開発とデバッグには php-fpm/apache などではなくコマンドラインを使用します。 Swoole では、`\Swoole\Coroutine::create()` を使用してコルーチンを作成するか、省略形 `go()` を使用することもできます。

Swoole コルーチンの最初の紹介

従来の fpm 同期モードと swoole コルーチンの違い

実行結果:

従来の fpm 同期モードと 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 &#39;time: &#39;, (microtime(true) - $time), &#39;s&#39;, PHP_EOL;
$time = microtime(true);
for($i = 0; $i < 10; ++$i)
{
    go(&#39;work&#39;);
}
swoole_event_wait(); // 等待所有协程执行完
echo &#39;time: &#39;, (microtime(true) - $time), &#39;s&#39;, 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 サイトの他の関連記事を参照してください。

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