ホームページ  >  記事  >  バックエンド開発  >  Swoole コルーチンと従来の fpm 同期モードの比較

Swoole コルーチンと従来の fpm 同期モードの比較

藏色散人
藏色散人転載
2019-04-28 10:07:103555ブラウズ

配列が PHP の本質である場合、配列を扱えないのであれば、PHP をまったく使用できるとは言えません。 Swoole のコルーチンも同様で、コルーチンを理解せずに Swoole を使用すると、やみくもに使用することになります。

Swoole コルーチンと従来の fpm 同期モードの比較

まず第一に、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 &#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 同期モードの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyurunsoft.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。