กระบวนการภายนอก? ถือเบียร์ของฉันซะ” นักพัฒนา 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