Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan RabbitMQ untuk penjadualan tugas dan pengurusan baris gilir dalam PHP

Cara menggunakan RabbitMQ untuk penjadualan tugas dan pengurusan baris gilir dalam PHP

WBOY
WBOYasal
2023-07-18 09:33:091086semak imbas

Cara menggunakan RabbitMQ untuk penjadualan tugas dan pengurusan baris gilir dalam PHP

1 Pengenalan
Apabila membangunkan aplikasi web, kita selalunya perlu mengendalikan beberapa tugas yang memakan masa, seperti menghantar e-mel, menjana laporan, memproses sejumlah besar data, dsb. . Jika tugasan ini dilaksanakan secara langsung dalam permintaan web, masa tindak balas mungkin diperlahankan dan pengalaman pengguna mungkin terjejas. Untuk menyelesaikan masalah ini, kami boleh menggunakan baris gilir mesej untuk penjadualan tugas dan pengurusan baris gilir. RabbitMQ ialah sistem baris gilir mesej yang berkuasa yang menyediakan API yang kaya yang boleh digunakan dengan mudah dalam PHP.

2. Pasang RabbitMQ
Pertama, kita perlu memasang RabbitMQ pada pelayan. Anda boleh memasangnya mengikut tutorial pemasangan yang disediakan di laman web rasmi, atau terus menggunakan Docker untuk menjalankan bekas RabbitMQ. Selepas pemasangan selesai, anda boleh melihat status baris gilir dan menguruskan baris gilir dengan mengakses halaman pengurusan RabbitMQ.

3. Gunakan perpustakaan PHP-amqplib untuk mengendalikan
Menggunakan RabbitMQ dalam PHP memerlukan penggunaan perpustakaan pihak ketiga, seperti PHP-amqplib. Perpustakaan ini boleh diperkenalkan melalui Komposer Perintahnya adalah seperti berikut:

composer require php-amqplib/php-amqplib

Selepas pemasangan selesai, masukkan fail perpustakaan ke dalam kod:

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

IV Sambung ke RabbitMQ
Sebelum menggunakan RabbitMQ, anda perlu menyambung ke Pelayan RabbitMQ:

$host = 'localhost';
$port = 5672;
$user = 'guest';
$pass = 'guest';
$connection = new AMQPStreamConnection($host, $port, $user, $pass);
$channel = $connection->channel();

Digunakan di sini Hos, port, nama pengguna dan kata laluan RabbitMQ lalai Jika terdapat keperluan tersuai, parameter ini boleh diubah suai mengikut situasi sebenar.

5. Hantar mesej ke baris gilir
Dalam penjadualan tugas, kami biasanya menghantar tugas ke baris gilir mesej untuk digunakan oleh Pekerja latar belakang. Mesej boleh dihantar ke baris gilir menggunakan kod berikut:

$message = new AMQPMessage('hello world');
$channel->basic_publish($message, '', 'task_queue');

Di sini kami mencipta contoh AMQPMessage dan menetapkan badan mesej untuk dihantar. Kemudian gunakan kaedah basic_publish untuk menghantar mesej ke baris gilir bernama task_queue.

6. Gunakan mesej dalam baris gilir
Menggunakan mesej dalam baris gilir memerlukan satu atau lebih proses Pekerja di latar belakang untuk diproses. Proses Pekerja akan mendapatkan semula mesej daripada baris gilir dan melaksanakan tugas yang sepadan. Anda boleh menggunakan kod berikut untuk menggunakan mesej dalam baris gilir:

$callback = function ($message) {
    echo "Received: " . $message->body . "
";
    usleep(100000);
    echo "Done
";
    $message->ack();
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
while (count($channel->callbacks)) {
    $channel->wait();
}

Di sini kami mentakrifkan fungsi tanpa nama $panggilan balik sebagai logik pemprosesan mesej. Dalam fungsi ini, kita boleh melakukan pemprosesan tugas tertentu, dan kemudian memanggil kaedah $message->ack() untuk menunjukkan bahawa tugasan telah selesai. Sebab mengapa kaedah ack dipanggil adalah kerana RabbitMQ tidak tahu sama ada tugasan itu berjaya dilaksanakan secara lalai, jadi kami perlu mengesahkan secara manual hasil pelaksanaan tugas itu.

7 Ketekunan mesej
Dalam contoh di atas, ketekunan mesej dimatikan secara lalai Apabila pelayan RabbitMQ dimulakan semula, mesej akan hilang. Jika kami mahu mesej dipulihkan secara automatik selepas pelayan dimulakan semula, kami perlu melakukan kegigihan mesej. Ia boleh ditetapkan dengan kod berikut:

$channel->queue_declare('task_queue', false, true, false, false);

Tetapkan parameter ketiga kepada benar, yang bermaksud baris gilir ditetapkan sebagai baris gilir berterusan.

8. Tugas tertunda
Kadangkala kita juga perlu melaksanakan tugas tertunda dan melaksanakan tugas selepas masa yang ditetapkan. RabbitMQ sendiri tidak menyokong fungsi melengahkan tugas, tetapi ia boleh dicapai dengan menambah pemalam tambahan. Pemalam yang biasa digunakan ialah rabbitmq_delayed_message_exchange, yang boleh dipasang dengan cara berikut:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

Selepas pemasangan, semasa menghantar mesej, tetapkan sifat AMQPMessage seperti berikut:

$message->set('application_headers', ['x-delay' => 3000]);

Kod di atas akan dilaksanakan dengan kelewatan sebanyak 3 saat selepas mesej dihantar.

9. Ringkasan
Melalui pengenalan artikel ini, kami telah mempelajari cara menggunakan RabbitMQ untuk penjadualan tugas dan pengurusan baris gilir dalam PHP. Selepas mempraktikkan langkah di atas, kami boleh menggunakan RabbitMQ dengan mudah untuk mengendalikan tugas yang memakan masa dan meningkatkan prestasi dan kebolehpercayaan aplikasi. Pada masa yang sama, ia juga memperkenalkan kegigihan mesej dan kaedah pemprosesan tugas yang tertangguh, membolehkan kami memenuhi keperluan yang berbeza dengan lebih baik. Saya harap artikel ini akan membantu anda menggunakan RabbitMQ dalam projek sebenar.

Bahan rujukan:

  1. Tapak web rasmi RabbitMQ: https://www.rabbitmq.com/
  2. Dokumentasi rasmi PHP-amqplib: https://github.com/php-amqplib/php-amqplib

Atas ialah kandungan terperinci Cara menggunakan RabbitMQ untuk penjadualan tugas dan pengurusan baris gilir dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn