ホームページ  >  記事  >  バックエンド開発  >  PHP コルーチンの詳細な説明: Go + Chan + Defer

PHP コルーチンの詳細な説明: Go + Chan + Defer

藏色散人
藏色散人転載
2021-06-27 17:01:184066ブラウズ

Swoole4 は、PHP 言語用の強力な CSP# を提供します # #Coroutine プログラミング モード。最下層には、さまざまな機能を簡単に実装できる 3 キーワードが用意されています。

  • Swoole4 が提供する PHP コルーチン 構文は Golang から借用したものです。 GO 開発チームのトリビュート
  • PHP Swooleコルーチンは Golang を非常によく補完します。 Golang: 静的言語、厳密で強力、パフォーマンスに優れています。 PHP Swoole: 動的言語、柔軟でシンプルで使いやすいです。
この記事は次のとおりです。
Swoole-4.2.9 および PHP-7.2.9 バージョン
キーワード

  • go に基づく:コルーチンの作成
  • chan: チャネルの作成
  • ##defer
  • : コルーチンの終了時に実行される遅延タスク、先入れ後出し
  • これ
3

関数の基礎となる実装はすべて メモリ操作 であり、IO リソースは消費されません。 PHPArray が非常に安いのと同じです。必要に応じて直接使用できます。これは、socket および file 操作とは異なります。後者は、オペレーティング システムからポートとファイル記述子を適用する必要があり、読み取りと書き込みによって IO のブロックが発生する可能性があります。待っている。 推奨学習: 「

PHP ビデオ チュートリアル


コルーチンの同時実行性

go

関数を使用して、関数は同時に実行されます。プログラミング プロセス中に、特定のロジックを同時に実行できる場合は、そのロジックを go コルーチンに配置して実行できます。 逐次実行

function test1() 
{
    sleep(1);
    echo "b";
}
    
function test2() 
{
    sleep(2);
    echo "c";
}

test1();
test2();

実行結果:

htf@LAPTOP-0K15EFQI:~$ time php b1.php
bc
real    0m3.080s
user    0m0.016s
sys     0m0.063s
htf@LAPTOP-0K15EFQI:~$

上記のコードでは、

test1

test2が順番に実行されます。これには、3実行が完了するまでに数秒かかります。 同時実行

go

を使用してコルーチンを作成すると、2 つの関数 test1test2 を同時に実行できます。 <pre class="brush:php;toolbar:false">Swoole\Runtime::enableCoroutine(); go(function ()  {     sleep(1);     echo &quot;b&quot;; });      go(function ()  {     sleep(2);     echo &quot;c&quot;; });</pre>

Swoole\Runtime::enableCoroutine()
この関数は、PHP が提供する streamsleep,# を使用します。 ##pdomysqliredis およびその他の関数が同期ブロッキングから非同期コルーチンに切り替わります IO実行結果:
bchtf@LAPTOP-0K15EFQI:~$ time php co.php
bc
real    0m2.076s
user    0m0.000s
sys     0m0.078s
htf@LAPTOP-0K15EFQI:~$
実行が完了するまでにかかった時間は

2

秒だけであることがわかります。

連続実行時間は、すべてのタスクの実行時間の合計に等しい:

t1 t2 t3...
  • 同時実行時間は等しい。全タスクの実行時間まで 最大値:max(t1, t2, t3, ...)
  • コルーチン通信
With

go

key 後は、同時プログラミングがはるかに簡単になります。同時に実行されている

2 コルーチンがあり、別のコルーチンがこれら 2 つのコルーチンの実行結果に依存する必要がある場合、この問題はどのように解決すればよいでしょうか? 答えは、チャネル (Channel

) を使用することです。

Swoole4 コルーチンで new chan を使用してチャネルを作成できます。チャネルは、独自のコルーチン スケジューリングを持つキューとして理解できます。 pushpop という 2 つのインターフェイスがあります。

push
    : コンテンツをチャネルに書き込みます。チャネルがいっぱいの場合は、それを書き込みます。
  • #pop: チャンネルからコンテンツを読み込み、空の場合は待機状態に入り、空きがあれば自動復帰します。データ
  • チャネルを使用すると、同時実行管理
  • を簡単に実現できます。
$chan = new chan(2);

# 协程1
go (function () use ($chan) {
    $result = [];
    for ($i = 0; $i < 2; $i++)
    {
        $result += $chan->pop();
    }
    var_dump($result);
});

# 协程2
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.qq.com', 80);
       $cli->set(['timeout' => 10]);
       $cli->setHeaders([
       'Host' => "www.qq.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   // $cli->body 响应内容过大,这里用 Http 状态码作为测试
   $chan->push(['www.qq.com' => $cli->statusCode]);
});

# 协程3
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.163.com', 80);
   $cli->set(['timeout' => 10]);
   $cli->setHeaders([
       'Host' => "www.163.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   // $cli->body 响应内容过大,这里用 Http 状态码作为测试
   $chan->push(['www.163.com' => $cli->statusCode]);
});

実行結果:

htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$ time php co2.php
array(2) {
  ["www.qq.com"]=>
  int(302)
  ["www.163.com"]=>
  int(200)
}

real    0m0.268s
user    0m0.016s
sys     0m0.109s
htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$

go

は、

3

コルーチン、コルーチン 2、およびコルーチン Cheng # を作成するためにここで使用されます。 ##3 は、それぞれ qq.com163.com のホームページをリクエストします。コルーチン 1Http リクエストの結果を取得する必要があります。 chan は、同時実行管理を実現するためにここで使用されます。 Coroutine1チャネルを

pop
    するために 2 回ループします。キューが空であるため、待機状態に入ります
  • Coroutine 2コルーチン 3
  • の実行が完了すると、データが
  • push されます。コルーチン 1 は結果を取得し、実行を継続します 遅延タスクコルーチン プログラミングでは、いくつかのタスクを自動的に実行し、コルーチンの終了時にクリーンアップする必要がある場合があります。
  • PHP

register_shutdown_function

と同様に、

Swoole4defer を使用して実装できます。

Swoole\Runtime::enableCoroutine();

go(function () {
    echo "a";
    defer(function () {
        echo "~a";
    });
    echo "b";
    defer(function () {
        echo "~b";
    });
    sleep(1);
    echo "c";
});
実行結果:
htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$ time php defer.php
abc~b~a
real    0m1.068s
user    0m0.016s
sys     0m0.047s
htf@LAPTOP-0K15EFQI:~/swoole-src/examples/5.0$
結論

Swoole4

提供された

Go Chan Defer

PHPです新しい CSP 同時プログラミング モデルをもたらします。 Swoole4 が提供するさまざまな機能を柔軟に使用することで、職場でのさまざまな複雑な機能の設計と開発を解決できます。

以上がPHP コルーチンの詳細な説明: Go + Chan + Deferの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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