ホームページ  >  記事  >  バックエンド開発  >  spatie/async ライブラリを使用して非同期 PHP コードを作成する方法を教えます

spatie/async ライブラリを使用して非同期 PHP コードを作成する方法を教えます

藏色散人
藏色散人転載
2020-11-09 15:33:435358ブラウズ

推奨: "PHP ビデオ チュートリアル "

PHP で書かれたほとんどのプログラムの唯一の目的は、複数のタスクで構成される単純なプロセスを実行することです。データ処理など、順次実行される。私たちは常に同期プログラミングの停止と待機に耐えなければなりません。コード実行の同期スタイルはブロッキングと呼ばれ、タスクが次々に実行されることを意味します。では、タスクを相互にブロックせずに実行したい場合、つまり非ブロックプロセスが必要な場合はどうすればよいでしょうか?このアプローチでは、タスクが相互依存せずに実行される、PHP での非同期プログラミング メソッドの適用が必要です。

PHP でノンブロッキング実行を実現する一般的な方法は、キュー処理を実装することです。タスクは MySQL、Redis、Amazon SQS などのトランスポートに保存され、バックグラウンド ワーカーによって取得され、それに応じて実行されるため、タスクを作成したメイン プロセスはブロックされません。 Laravel アプリケーションは、タスク (この場合はジョブと呼ばれます) を後で処理できるようにするキューイング メカニズムを提供します。

もう 1 つのアプローチは、定義されたすべてのタスクを並行して実行することです。このアプローチからわかることは、特定のタスクが完了するとすぐに、コードを実行し、後で結果を通知する (コールバックなど) ことを約束して、制御をメイン プロセスに戻すことができるということです。並列処理メソッドの使用例はほとんど見られないかもしれません。使用例としては、画像処理を実行し、外部サービスに GET リクエストを行うことが考えられます。

非常に単純な使用例を通じて、PHP の同期プロセスと非同期 (並列) プロセスの違いを見てみましょう。

同期コード

foreach (range(1, 5) as $i) {
    $output = $i * 2;
    echo $output . "\n";
}

非同期コード

use Spatie\Async\Pool;

$pool = Pool::create();

foreach (range(1, 5) as $i) {
    $pool[] = async(function () use ($i) {
       $output = $i * 2;
       return $output;
    })->then(function (int $output) {
       echo $output . "\n";
    });
}
await($pool);

最初のコードを実行すると、次のようになります。 order 出力値を取得します:

2
4
6
8
10

実行を再試行すると、上記と同じ一連の出力が得られます。したがって、各乗算演算は、次の乗算演算の前に実行されるまで待機します。次に、2 番目のコード ブロックを実行して、何が得られるかを見てみましょう。

6
10
2
8
4

2 回目の再試行実行:

2
6
4
10
8

プロセスは 2 つの異なる結果を生成します。これはまさに非同期メソッドを使用して得られるものです。小さなタスクはノンブロッキングで実行できます。各乗算タスクは独立して実行され、一部のタスクが他のタスクよりも高速に実行されるため、出力は混乱します。また、非同期関数は、制御を取り戻す役割を担う then メソッドとしてアタッチされており、引数としてコールバック関数を受け入れるため、受信した出力に対して追加のアクションを実行できることに注意してください。

Spatie の人々は、タスクの並列実行に役立つ素晴らしい spacee/async パッケージを開発しました。このパッケージは Composer 経由でインストールできます。

composer require spatie/async

このパッケージは、並行して実行される作成されたタスクと対話するための賢い方法を提供します。タスクのイベント リスナーは次のように記述されます。

  • コールバックは then メソッドを通じて実装できるため、タスクが完了したら操作を再度実行します。
  • 特定のタスクが catch メソッドを使用して例外をスローすると、エラー処理の制御が容易になります。
  • timeout メソッドを使用すると、タスクが操作を完了しない場合のシナリオを処理できます。

イベント リスナーは、以下に示すようにタスクに接続されます。

$pool
    ->add(function () {
        // 要在并行进程中执行的任务
    })
    ->then(function ($output) {
        // 如果成功,进程或者你传递到队列的回调函数会返回`$output`。
    })
    ->catch(function ($exception) {
        // 当进程内抛出异常时,它会被捕获并传递到这里。
    })
    ->timeout(function () {
        // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
    })
;

この spacee/async パッケージの詳細については、次のいずれかを読んでください。この記事の寄稿者は、GitHub リポジトリを参照することもできます。

元のアドレス: https://dev.to/webong/using-asynchronous-processes-in-php-7io

翻訳アドレス: https://learnku.com/ php/t/51334

以上がspatie/async ライブラリを使用して非同期 PHP コードを作成する方法を教えますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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