Paket ini memudahkan menjalankan PHP secara bersamaan. Di balik layar, konkurensi dicapai dengan membagi proses utama PHP ke satu atau lebih tugas turunan.
Dalam contoh ini, saat kita akan memanggil API lambat imajiner, ketiga penutupan akan berjalan secara bersamaan.
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
Dalam video di YouTube ini, kami menjelaskan cara kerja paket secara internal.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Paket ini memerlukan PHP 8 dan ekstensi pcntl yang diinstal di banyak sistem Unix dan Mac secara default.
pcntl hanya berfungsi dalam proses CLI, bukan dalam konteks web. posix diperlukan untuk penanganan penghentian proses yang benar untuk Alpine Linux.
Anda dapat menginstal paket melalui composer:
composer require spatie/fork
Anda dapat melewati penutupan sebanyak yang Anda ingin run
. Mereka akan dijalankan secara bersamaan. Fungsi run
akan mengembalikan array dengan nilai kembalian dari penutupan yang dieksekusi.
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'
Jika Anda perlu mengeksekusi beberapa kode sebelum atau sesudah setiap callable diteruskan ke run
, Anda dapat meneruskan callable ke metode before
atau after
. Callable yang diteruskan ini akan dieksekusi dalam proses anak tepat sebelum atau setelah eksekusi callable yang diteruskan ke run
.
before
dan after
dalam tugas anak Berikut adalah contoh dimana kita akan mendapatkan nilai dari database menggunakan model Laravel Eloquent. Agar tugas anak dapat menggunakan DB, perlu menyambung kembali ke DB. Penutupan yang diteruskan ke before
akan dijalankan di kedua tugas anak yang dibuat untuk penutupan yang diteruskan ke 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 (),
);
Jika Anda perlu melakukan pembersihan pada tugas anak setelah callable dijalankan, Anda dapat menggunakan metode after
pada instance SpatieForkFork
.
before
dan after
dalam tugas induk. Jika Anda perlu membiarkan callable diteruskan ke before
atau after
dijalankan di tugas induk, maka Anda harus meneruskan callable tersebut ke argumen 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 (),
);
Anda juga dapat melewati penutupan yang berbeda, untuk dijalankan pada tugas anak dan induk
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 (),
);
Semua data keluaran dikumpulkan dalam sebuah array dan tersedia segera setelah semua anak selesai. Dalam contoh ini, $results
akan berisi tiga item:
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
Outputnya juga tersedia di callback after
, yang dipanggil setiap kali anak selesai dan bukan di akhir:
$ 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 ,
);
Terakhir, nilai kembalian dari tugas anak diserialkan menggunakan metode serialize
bawaan PHP. Ini berarti Anda dapat mengembalikan apa pun yang biasa Anda buat bersambung di PHP, termasuk objek:
$ result = Fork:: new ()
-> run (
fn () => new DateTime ( ' 2021-01-01 ' ),
fn () => new DateTime ( ' 2021-01-02 ' ),
);
Secara default, semua callable akan dijalankan secara paralel. Namun Anda dapat mengonfigurasi jumlah maksimum proses bersamaan:
$ results = Fork:: new ()
-> concurrent ( 2 )
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
Dalam hal ini, dua fungsi pertama akan segera dijalankan dan segera setelah salah satunya selesai, fungsi terakhir juga akan dimulai.
composer test
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Harap tinjau kebijakan keamanan kami tentang cara melaporkan kerentanan keamanan.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.