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 - : コルーチンの終了時に実行される遅延タスク、先入れ後出し
関数の基礎となる実装はすべて メモリ操作
であり、IO リソースは消費されません。 PHP
Array
が非常に安いのと同じです。必要に応じて直接使用できます。これは、socket
および file
操作とは異なります。後者は、オペレーティング システムからポートとファイル記述子を適用する必要があり、読み取りと書き込みによって IO
のブロックが発生する可能性があります。待っている。 推奨学習: 「
関数を使用して、関数は同時に実行されます。プログラミング プロセス中に、特定のロジックを同時に実行できる場合は、そのロジックを 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
実行が完了するまでに数秒かかります。 同時実行
を使用してコルーチンを作成すると、2 つの関数 test1
と test2
を同時に実行できます。 <pre class="brush:php;toolbar:false">Swoole\Runtime::enableCoroutine();
go(function ()
{
sleep(1);
echo "b";
});
go(function ()
{
sleep(2);
echo "c";
});</pre>
この関数は、実行が完了するまでにかかった時間はPHP が提供する
stream、
sleep,# を使用します。
##pdo、
mysqli、
redisおよびその他の関数が同期ブロッキングから非同期コルーチンに切り替わります
IO実行結果:
bchtf@LAPTOP-0K15EFQI:~$ time php co.php bc real 0m2.076s user 0m0.000s sys 0m0.078s htf@LAPTOP-0K15EFQI:~$
2
秒だけであることがわかります。連続実行時間は、すべてのタスクの実行時間の合計に等しい:
-
同時実行時間は等しい。全タスクの実行時間まで 最大値:
max(t1, t2, t3, ...) -
コルーチン通信
go
key 後は、同時プログラミングがはるかに簡単になります。同時に実行されている2 コルーチンがあり、別のコルーチンがこれら 2 つのコルーチンの実行結果に依存する必要がある場合、この問題はどのように解決すればよいでしょうか?
答えは、チャネル (
Channel
Swoole4 コルーチンで
new chan を使用してチャネルを作成できます。チャネルは、独自のコルーチン スケジューリングを持つキューとして理解できます。
push と
pop という 2 つのインターフェイスがあります。
- : コンテンツをチャネルに書き込みます。チャネルがいっぱいの場合は、それを書き込みます。
-
#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$
は、
3 コルーチン、コルーチン 2
、およびコルーチン Cheng # を作成するためにここで使用されます。 ##3 は、それぞれ
qq.com と
163.com のホームページをリクエストします。コルーチン
1 は
Http リクエストの結果を取得する必要があります。
chan は、同時実行管理を実現するためにここで使用されます。
Coroutine
1
チャネルを
- するために 2 回ループします。キューが空であるため、待機状態に入ります
-
Coroutine
2コルーチン
3 の実行が完了すると、データが - push
されます。コルーチン
1は結果を取得し、実行を継続します
遅延タスク
コルーチン プログラミングでは、いくつかのタスクを自動的に実行し、コルーチンの終了時にクリーンアップする必要がある場合があります。
PHP
register_shutdown_function
と同様に、Swoole4 の
defer を使用して実装できます。
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 が提供するさまざまな機能を柔軟に使用することで、職場でのさまざまな複雑な機能の設計と開発を解決できます。