このパッケージを使用すると、PHP を同時に実行することが簡単になります。バックグラウンドでは、メインの PHP プロセスを 1 つ以上の子タスクにフォークすることで同時実行性が実現されます。
この例では、架空の低速 API を呼び出す予定で、3 つのクロージャすべてが同時に実行されます。
use Spatie Fork Fork ;
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
$ results [ 0 ]; // fetched data of user 1
$ results [ 1 ]; // fetched data of user 2
$ results [ 2 ]; // fetched data of user 3
YouTube のこのビデオでは、パッケージが内部でどのように動作するかを説明します。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
このパッケージには、PHP 8 と、多くの Unix および Mac システムにデフォルトでインストールされる pcntl 拡張機能が必要です。
pcntl は CLI プロセスでのみ機能し、Web コンテキストでは機能しません。 Alpine Linux のプロセス終了を正しく処理するには、posix が必要です。
パッケージは、composer 経由でインストールできます。
composer require spatie/fork
run
たいだけクロージャを渡すことができます。これらは同時に実行されます。 run
関数は、実行されたクロージャの戻り値を含む配列を返します。
use Spatie Fork Fork ;
$ results = Fork:: new ()
-> run (
function () {
sleep ( 1 );
return ' result from task 1 ' ;
},
function () {
sleep ( 1 );
return ' result from task 2 ' ;
},
function () {
sleep ( 1 );
return ' result from task 3 ' ;
},
);
// this code will be reached this point after 1 second
$ results [ 0 ]; // contains 'result from task 1'
$ results [ 1 ]; // contains 'result from task 2'
$ results [ 2 ]; // contains 'result from task 3'
run
に渡される各呼び出し可能オブジェクトの前後にコードを実行する必要がある場合は、メソッドafter
before
に呼び出し可能オブジェクトを渡すことができます。渡されたこの呼び出し可能オブジェクトは、 run
に渡された呼び出し可能オブジェクトの実行の直前または直後に、子プロセスで実行されます。
before
とafter
使用以下は、Laravel Eloquent モデルを使用してデータベースから値を取得する例です。子タスクにDBを利用させるためにはDBに再接続する必要があります。 before
に渡されたクロージャは、 run
に渡されたクロージャ用に作成された両方の子タスクで実行されます。
use App Models User ;
use Illuminate Support Facades DB ;
use Spatie Fork Fork ;
Fork:: new ()
-> before ( fn () => DB :: connection ( ' mysql ' )-> reconnect ())
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
呼び出し可能なタスクの実行後に子タスクでクリーンアップを実行する必要がある場合は、 SpatieForkFork
インスタンスでafter
メソッドを使用できます。
before
とafter
使用します。親タスクの実行before
または実行after
に呼び出し可能オブジェクトを渡す必要がある場合は、その呼び出し可能オブジェクトをparent
引数に渡す必要があります。
use App Models User ;
use Illuminate Support Facades DB ;
use Spatie Fork Fork ;
Fork:: new ()
-> before (
parent: fn () => echo ' this runs in the parent task '
)
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
異なるクロージャを渡して、子タスクと親タスクで実行することもできます。
use Spatie Fork Fork ;
Fork:: new ()
-> before (
child: fn () => echo ' this runs in the child task ' ,
parent: fn () => echo ' this runs in the parent task ' ,
)
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
すべての出力データは配列に収集され、すべての子が完了するとすぐに利用可能になります。この例では、 $results
には 3 つの項目が含まれます。
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
出力は、 after
コールバックでも利用できます。このコールバックは、最後ではなく子が完了するたびに呼び出されます。
$ results = Fork:: new ()
-> after (
child: fn ( int $ i ) => echo $ i , // 1, 2 and 3
parent: fn ( int $ i ) => echo $ i , // 1, 2 and 3
)
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
最後に、子タスクからの戻り値は、PHP の組み込みのserialize
メソッドを使用してシリアル化されます。これは、オブジェクトを含め、PHP で通常シリアル化できるものはすべて返すことができることを意味します。
$ result = Fork:: new ()
-> run (
fn () => new DateTime ( ' 2021-01-01 ' ),
fn () => new DateTime ( ' 2021-01-02 ' ),
);
デフォルトでは、すべての呼び出し可能関数は並行して実行されます。ただし、同時プロセスの最大数を構成できます。
$ results = Fork:: new ()
-> concurrent ( 2 )
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
この場合、最初の 2 つの関数はすぐに実行され、そのうちの 1 つが終了するとすぐに最後の関数も開始されます。
composer test
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティの脆弱性を報告する方法については、セキュリティ ポリシーをご覧ください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。