กระบวนการภายนอก? ถือเบียร์ของฉันซะ” นักพัฒนา Laravel กล่าว
เพื่อให้มินิซีรีส์ของฉันเสร็จสมบูรณ์ (ตอนที่ 1: รูปแบบการออกแบบพูลผู้ปฏิบัติงานด้วย PHP, ส่วนที่ 2: ไม่แบ่งปันเลย, คัดลอกตามค่าและไปที่ \parallel) ในการประมวลผลแบบขนาน ฉันจะแสดงให้คุณเห็นถึงวิธีการนำการออกแบบพูลผู้ปฏิบัติงานไปใช้ รูปแบบโดยใช้ Laravel
เริ่มต้นจาก Laravel 10.x นักพัฒนาสามารถใช้ API ขั้นต่ำรอบๆ ส่วนประกอบ Symfony Process เพื่อจัดการกระบวนการภายนอก
ฉันรู้ ฉันรู้ … Laravel มี ระบบการจัดการคิวขั้นสูง ที่สามารถใช้สำหรับตัวอย่างของเรา (เพียงเตือนว่าเรามีคิวพร้อมข้อความที่รอการโอนไปยังผู้รับหลายราย) ให้เราสมมติว่านี่เป็นระบบดั้งเดิมบางประเภทที่ไม่สามารถรวมเข้ากับแอปพลิเคชัน Laravel ของเราได้ทั้งหมด
ในทางกลับกัน มันจะไม่เป็น "สถานการณ์การดื่มเบียร์ของฉัน" ถ้าฉันจะใช้ตัวเลือกที่ชัดเจน
อย่างไรก็ตาม ผมจะพยายามจำลองสิ่งที่คุณเห็นมาแล้วในภาค 1 และภาค 2 ให้ใกล้เคียงที่สุดเท่าที่จะเป็นไปได้ เพื่อให้เราสามารถเปรียบเทียบระหว่างแอปเปิ้ลกับแอปเปิ้ลได้
การประมวลผลแบบขนาน PHP ส่วนใหญ่เป็นธุรกิจ CLI ด้วย Laravel 10.x คุณสามารถบรรลุเป้าหมายเดียวกันในเว็บแอปพลิเคชันของคุณ
ไม่น่าแปลกใจมากที่คุณไม่จำเป็นต้องทำอะไรซับซ้อน Laravel เป็นเฟรมเวิร์กที่ยอดเยี่ยมซึ่งทำให้การประมวลผลแบบขนานไม่ยุ่งยาก … :-)
ตอนนี้เรามาดูวิธีใช้ฟังก์ชันการจัดการกระบวนการของ Laravel:
public function run() { foreach ($this->arraySlice($this->getFilesFromQueue(), self::MAXWORKERS) as $files) { $pool = Process::pool(function (Pool $pool) use ($files) { foreach ($files as $fileName) { list('url' => $url, 'recipient' => $recipient) = self::processSms($fileName); $pool->as($recipient)->command($this->command.$url); } })->start(function (string $type, string $output, int $key) { $result = ($output === '200') ? 'SMS successfully sent to '.str_shuffle($key).' phone number' : 'Failed to send SMS to '.str_shuffle($key).' phone number'; $this->output[] = self::printMessage($result); }); while ($pool->running()->isNotEmpty()) { $this->output[] = self::printMessage('Processing messages in progress ...'); usleep(50000); } // Wait for all workers to finish ... $results = $pool->wait(); } }
นี่ไม่มีอะไรมากไปกว่ากระบวนการ 2 ขั้นตอน:
- ขึ้นอยู่กับจำนวนพนักงานสูงสุดที่สร้างข้อความตั้งแต่หนึ่งชิ้นขึ้นไป (วิธี arraySlice ให้ผลลัพธ์เป็นชิ้นขนาด MAXWORKERS ของคิวของเรา)
- สร้างกลุ่มกระบวนการและเริ่มกระบวนการสำหรับแต่ละข้อความในกลุ่มจริงแบบอะซิงโครนัส (วิธีการเริ่มต้นทำเช่นนั้น)
ตรรกะทั้งหมดนี้ “ตั้งอยู่” ภายในส่วนประกอบ Livewire (ฉันชอบ SPA) เพื่อให้สามารถแชร์ผลลัพธ์ของกระบวนการได้อย่างง่ายดายผ่านทรัพย์สินสาธารณะและเทมเพลตใบมีด Laravel
อย่างที่ฉันบอกไปแล้วว่าจะเป็นตัวเลือกที่ชัดเจนในการใช้ฟังก์ชันการจัดการคิวของ Laravel แต่ก็ไม่สามารถทำได้เสมอไป
หากคุณต้องการเรียกใช้กระบวนการภายนอกด้วย Laravel 10.x ตอนนี้มันเป็นเรื่องง่าย รองรับการส่งสัญญาณ ท่อ และคุณสมบัติอื่นๆ อีกด้วย
สำหรับเอกสารฉบับเต็ม โปรดไปที่: https://laravel.com/docs/10.x/processes