Proses eksternal? Tunggu birku, kata pengembang Laravel

Untuk melengkapi miniseri saya (Bagian 1: Pola desain Worker Pool dengan PHP, Bagian 2: Tidak membagikan apa pun, menyalin berdasarkan nilai, dan melakukan \paralel) pada pemrosesan paralel, saya akan menunjukkan cara mengimplementasikan desain Worker Pool pola menggunakan Laravel.

Mulai dari Laravel 10.x, pengembang dapat menggunakan API minimal di sekitar komponen Proses Symfony untuk mengelola proses eksternal.

Saya tahu, saya tahu… Laravel memiliki “sistem manajemen antrean tingkat lanjut” yang dapat digunakan sebagai contoh kita (hanya sebagai pengingat bahwa kita memiliki antrean dengan pesan yang menunggu untuk ditransfer ke berbagai penerima). Mari kita berasumsi bahwa ini adalah semacam sistem lama yang tidak dapat dimasukkan ke dalam aplikasi Laravel kita sepenuhnya.

Di sisi lain, ini bukanlah sebuah Tahan situasi bir saya jika saya menggunakan pilihan yang sudah jelas.

Bagaimanapun, saya akan mencoba meniru apa yang telah Anda lihat di Bagian 1 dan Bagian 2 sedekat mungkin sehingga kita dapat melakukan perbandingan apple-to-apple.

Pemrosesan paralel PHP pada dasarnya adalah bisnis CLI. Dengan Laravel 10.x Anda dapat mencapai hal yang sama dalam aplikasi web Anda.

Tidak mengherankan Anda tidak perlu melakukan sesuatu yang rumit. Laravel adalah kerangka kerja luar biasa yang membuat pemrosesan paralel tidak merepotkan… :-)

Sekarang mari kita lihat cara menggunakan fungsionalitas manajemen proses 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();
     }

}

Ini sebenarnya tidak lebih dari proses 2 langkah:

  • berdasarkan jumlah maksimum pekerja yang membuat satu atau lebih potongan pesan (metode arraySlice menghasilkan potongan ukuran MAXWORKERS dari antrian kami);
  • membuat kumpulan proses dan memulai proses untuk setiap pesan dalam potongan sebenarnya secara asinkron (metode start melakukan hal itu);

Semua logika ini “berada” di dalam komponen Livewire (saya suka SPA) sehingga output dari proses dapat dibagikan dengan mudah melalui properti publik dan template blade Laravel.

Seperti yang saya katakan, menggunakan fungsi manajemen antrian Laravel merupakan pilihan yang jelas, tetapi hal ini tidak selalu memungkinkan.

Jika Anda perlu menjalankan proses eksternal maka dengan Laravel 10.x sekarang menjadi mudah. Ini mendukung pensinyalan, pipa dan fitur lainnya juga.

Untuk dokumentasi lengkap silakan kunjungi: https://laravel.com/docs/10.x/processes