te28

非同期PHP-stitcher.io

(jp) =

Spatie で新しいパッケージに取り組んでいます。 これは spatie/async と呼ばれ、PHP で非同期並列処理を行うためのものです。

PHP での並列処理は、多くの Web 開発者にとって特殊なケースのように思えるかもしれませんが、Spatie で見られるいくつかの使用例を見てみましょう。

使いやすいパッケージを作成したいと考えていましたが、ユース ケースを解決できるものでした。 上記の例の一部では、新しい spatie/async Laravel にはキューイング システムも用意されているためです。

これは、パッケージの非同期コードがどのように見えるかです。

use Spatie\Async\Process;

$pool = Pool::create();

foreach (range(1, 5) as $i) 
    $pool[] = async(function () use ($i) 
        
    )->then(function (int $output) 
        
    )->catch(function (Exception $exception) 
        
    );


await($pool);

# 優れたアンプ? まだです。

並列 PHP に興味がある場合は、おそらく Amp と ReactPHP について聞いたことがあるでしょう。 私たちのパッケージは、PHP の並列処理の小さな側面を 1 つしか解決しないため、これら 2 つと競合しないことを目指しています。 そして別の方法で解決しようとします。

ただし、パッケージのパフォーマンスを Amp と比較するために、いくつかのベンチマークを実行しました。 Amp の開発者の 1 人である Niklas Keller に感謝します。 彼は以前のベンチマークのいくつかの間違いを指摘し、それらをより公平にするのに役立ちました.

新しいベンチマークは、いくつかのシナリオを比較します。 最初の 2 つのグループは空のプロセスの実行時間をプロットし、3 番目と 4 番目のグループは終了までの時間が異なるプロセスの実行時間を示します。 sleep 間隔。 2 つのグループ間で、上限のある同時実行数の構成と上限のない構成も比較しています。 上限があるということは、プールが一度に実行できるよりも多くのプロセスがあることを意味します。

ベンチマークコードはここにあります。

Amp と spatie/async の比較Amp と spatie/async の比較

これらのテストからいくつかの結論を導き出そうとしました。

  • 実際のプロセスは、実行して終了するまでに時間がかかります。 私たちのユースケースでは、”with logic” ベンチマークがより適切です。
  • プロセスの実行時間に関しては、パッケージのオーバーヘッドが少ないようです。プールが同時実行を管理する必要がない限り、より速く終了しています。
  • ただし、実際のアプリケーションでは、最大同時実行数の設定が有効になる可能性が高いため、Amp よりも優れたパフォーマンスが必要な場合は、コードベースのその部分を改善する必要があることは明らかです。

# ReactPHP はどうですか?

ReactPHP は公平な比較ではないため、ベンチマークから除外しました。 ReactPHP は、クロージャーの実行を許可していません。 Tasks アンプと私たちのパッケージが行うようにサブプロセスします。 ReactPHP では、プレーンなプロセスで作業しているため、比較する方法はありません。

# プロセスシグナルについて

私たちのパッケージとアンプの最大の違いは、プロセス間の通信方法です。 プロセスがいつ終了するかを判断するために、プロセス シグナルのみに依存しています。 オーバーヘッドが少なくなりますが、ターゲット プラットフォームとして Windows が除外されます。

UNIX システムのプロセスは、相互にシグナルを送信できます。 受信したシグナルの種類によって、プロセスの動作が異なります。 シグナルはカーネルによって処理されるため、かなり低レベルです。 ただし、PHP 7.1 より前では、 declare(ticks=1) 信頼できる方法で非同期信号を使用する。 これは、PHP がより頻繁にシグナルをチェックすることを意味しますが、多くのオーバーヘッドも発生します。

ティックは、declare ブロック内のパーサーによって実行される N 個の低レベルのティック可能なステートメントごとに発生するイベントです。 N の値は、declare ブロックのディレクティブ セクション内で ticks=N を使用して指定されます。

PHP 7.1 では、カーネルから送信された割り込みを処理する新しい方法があります。

PHP 7.1 の Zend Engine は拡張され、安全なタイムアウトと割り込み処理が可能になりました。 実際には、PHP VM は、各ループ反復、ユーザー関数のエントリ、または内部関数の終了で EG(vm_interrupt) フラグをチェックし、必要に応じてコールバック関数を呼び出します。

使用することで pcntl_async_signals(true)、PHP はより効率的な方法でシグナルをチェックするようになりました。 より詳細な説明は、Dmitry Stogov によって提出された rfc にあります。

このメカニズムのおかげで、ソケットやプロセス ステータス ポーリングに依存することなく、プロセス ステータスの変化に実際に非同期で対応できます。

次の投稿
それは冬です: フロリダに落ちてくるイグアナはいますか?
前の投稿
ここで金曜日の予測を確認してください

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。