แพ็คเกจนี้ทำให้การรัน PHP พร้อมกันเป็นเรื่องง่าย เบื้องหลัง การทำงานพร้อมกันทำได้โดยการแยกกระบวนการ PHP หลักไปยังงานย่อยหนึ่งงานขึ้นไป
ในตัวอย่างนี้ ซึ่งเราจะเรียก API ที่ช้าในจินตนาการ การปิดทั้งสามรายการจะทำงานพร้อมกัน
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 และส่วนขยาย pcntl ซึ่งติดตั้งในระบบ Unix และ Mac หลายระบบตามค่าเริ่มต้น
pcntl ใช้งานได้เฉพาะในกระบวนการ CLI ไม่ใช่ในบริบทของเว็บ posix ที่จำเป็นสำหรับการจัดการการยุติกระบวนการที่ถูกต้องสำหรับ Alpine Linux
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
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'
หากคุณต้องการรันโค้ดก่อนหรือหลังแต่ละ callable ที่ส่งผ่านเพื่อ run
คุณสามารถส่ง callable ไปที่ before
หรือ after
วิธีการได้ callable pass นี้จะถูกดำเนินการในกระบวนการลูกก่อนหรือหลังการดำเนินการของ callable ที่ส่งผ่านไปยัง 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 (),
);
หากคุณต้องการทำการล้างข้อมูลในงานลูกหลังจากที่เรียกใช้ callable แล้ว คุณสามารถใช้เมธอด after
บนอินสแตนซ์ SpatieForkFork
before
และ after
ในงานพาเรนต์ หากคุณต้องการปล่อยให้ callable ผ่านไป before
หรือ after
รันในงานพาเรนต์ คุณจะต้องส่งผ่าน callable นั้นไปยังอาร์กิวเมนต์ 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
จะมีสามรายการ:
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
เอาต์พุตยังมีอยู่ใน after
callbacks ซึ่งจะถูกเรียกทุกครั้งที่ลูกทำเสร็จแล้วและไม่ได้อยู่ที่ตอนท้ายสุด:
$ 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 ,
);
สุดท้าย ค่าที่ส่งคืนจากงานลูกจะถูกทำให้เป็นอนุกรมโดยใช้วิธีการทำให้ serialize
ของ PHP ซึ่งหมายความว่าคุณสามารถส่งคืนทุกสิ่งที่คุณสามารถทำให้เป็นอนุกรมใน PHP ได้ตามปกติ รวมถึงอ็อบเจ็กต์:
$ result = Fork:: new ()
-> run (
fn () => new DateTime ( ' 2021-01-01 ' ),
fn () => new DateTime ( ' 2021-01-02 ' ),
);
ตามค่าเริ่มต้น callables ทั้งหมดจะทำงานแบบขนาน อย่างไรก็ตาม คุณสามารถกำหนดค่ากระบวนการที่เกิดขึ้นพร้อมกันได้สูงสุด:
$ results = Fork:: new ()
-> concurrent ( 2 )
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
ในกรณีนี้ สองฟังก์ชันแรกจะทำงานทันที และทันทีที่ฟังก์ชันใดฟังก์ชันหนึ่งเสร็จสิ้น ฟังก์ชันสุดท้ายก็จะเริ่มทำงานเช่นกัน
composer test
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
โปรดตรวจสอบนโยบายความปลอดภัยของเราเกี่ยวกับวิธีการรายงานจุดอ่อนด้านความปลอดภัย
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม