Bekerja dengan RabbitMQ di PHP
Terbitkan dan konsumsi pesan dengan RabbitMQ.
Bekerja dengan RabbitMQ di PHP adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
RabbitMQ dalam PHP
RabbitMQ adalah perantara yang menggunakan AMQP 0-9-1. Dalam PHP, klien yang umum digunakan adalah php-amqplib/php-amqplib (PHP murni) atau ext-amqp yang berbasis C. Pelajaran ini menggunakan php-amqplib karena dapat berjalan di mana pun Composer dapat berjalan.
Model AMQP inti memiliki tiga komponen: pertukaran menerima pesan, pengikatan merutekannya berdasarkan kunci, dan antrean menahannya untuk konsumen. Kuasai hal ini, dan bagian lainnya hanyalah perincian.
Menginstal Klien
Tambahkan pustaka dengan Composer. Pustaka ini memerlukan ekstensi sockets dan bcmath, yang keduanya umum tersedia dalam versi PHP CLI.
composer require php-amqplib/php-amqplib
# Connection target, e.g. amqp://guest:guest@localhost:5672/Model Pertukaran/Antrean/Pengikatan
Produsen menerbitkan pesan ke pertukaran, bukan langsung ke antrean. Jenis pertukaran menentukan perutean:
direct— cocok persis dengan kunci perutean.topic— pola dengan karakter bebas sepertiorder.*.eu.fanout— menyiarkan ke semua antrean yang terhubung.headers— mencocokkan atribut tajuk.
Pengikatan menghubungkan antrean ke pertukaran dengan pola perutean. Memisahkan produsen dari topologi antrean adalah tujuan utama lapisan pertukaran.
Menghubungkan dan Mendeklarasikan
Buka koneksi, dapatkan kanal, dan deklarasikan topologi Anda. durable: true membuat the pertukaran/antrian tetap bertahan setelah server perantara dimulai ulang. Deklarasi bersifat idempoten — mendeklarasikan entitas yang sudah ada dengan argumen yang cocok tidak melakukan operasi apa pun.
<?php
require 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$conn = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$ch = $conn->channel();
$ch->exchange_declare('orders', 'topic', false, true, false);
$ch->queue_declare('orders.email', false, true, false, false);
$ch->queue_bind('orders.email', 'orders', 'order.created');
echo "Topology ready\n";
$ch->close();
$conn->close();Menerbitkan Pesan
Bungkus isi dalam AMQPMessage. Atur delivery_mode = 2 agar pesan menjadi persisten — antrian tahan lama + pesan persisten adalah yang dapat bertahan setelah dimulai ulang (salah satunya saja tidak cukup).
<?php
require 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$conn = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$ch = $conn->channel();
$payload = json_encode(['orderId' => 42, 'total' => 19.90]);
$msg = new AMQPMessage($payload, [
'content_type' => 'application/json',
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
'message_id' => bin2hex(random_bytes(8)),
]);
$ch->basic_publish($msg, 'orders', 'order.created');
echo "Published\n";
$ch->close();
$conn->close();Mengonsumsi dengan Konfirmasi Manual
Daftarkan panggilan balik dengan basic_consume. Berikan no_ack = false agar Anda mengendalikan konfirmasi penerimaan. Kirim konfirmasi hanya setelah pekerjaan berhasil; jika gagal, basic_nack dengan pengantrean ulang memungkinkan RabbitMQ mengirimkan pesan itu kembali.
<?php
require 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$conn = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$ch = $conn->channel();
$ch->basic_qos(null, 10, null); // prefetch 10
$callback = function ($msg) {
$data = json_decode($msg->getBody(), true);
try {
// ... do work ...
$msg->ack();
} catch (\Throwable $e) {
$msg->nack(true); // requeue
}
};
$ch->basic_consume('orders.email', '', false, false, false, false, $callback);
while ($ch->is_consuming()) {
$ch->wait();
}Pengambilan Awal dan Distribusi Adil
Secara bawaan, RabbitMQ membagikan pesan secara bergiliran kepada konsumen tanpa memperhatikan seberapa sibuk masing-masing konsumen — konsumen yang lambat akan menumpuk pekerjaan. basic_qos(null, prefetch, null) membatasi jumlah pesan yang belum dikonfirmasi yang boleh disimpan oleh seorang konsumen.
Atur jumlah pengambilan awal ke angka kecil (misalnya, 1–10) untuk tugas berat yang bebannya tidak merata, agar server perantara mengirim pekerjaan baru hanya kepada konsumen yang memiliki kapasitas kosong. Inilah distribusi adil.
Konfirmasi Penerbit
basic_publish segera mengembalikan hasil dan tidak memberi tahu Anda apakah server perantara menerima pesan tersebut. Untuk penerbitan yang terjamin, aktifkan konfirmasi penerbit: server perantara mengirim konfirmasi setelah pesan disimpan atau dirutekan dengan aman.
<?php
require 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$conn = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$ch = $conn->channel();
$ch->confirm_select(); // enable confirms on this channel
$ch->set_ack_handler(fn($m) => print("confirmed\n"));
$ch->set_nack_handler(fn($m) => print("REJECTED\n"));
$ch->basic_publish(new AMQPMessage('hi'), 'orders', 'order.created');
$ch->wait_for_pending_acks(5.0); // block until confirmed or timeoutPenanganan Pesan Gagal
Konfigurasikan argumen x-dead-letter-exchange pada sebuah antrian agar pesan yang ditolak (nack tanpa pengantrean ulang) atau kedaluwarsa dirutekan ke DLX. Gabungkan dengan x-delivery-limit pada antrian kuorum untuk membatasi percobaan ulang secara otomatis.
<?php
use PhpAmqpLib\Wire\AMQPTable;
$args = new AMQPTable([
'x-dead-letter-exchange' => 'orders.dlx',
'x-dead-letter-routing-key' => 'order.failed',
'x-message-ttl' => 60000, // ms before expiry
]);
// false=passive, true=durable, false=exclusive, false=autodelete, args
$ch->queue_declare('orders.email', false, true, false, false, false, $args);
$ch->queue_declare('orders.dead', false, true, false, false);
$ch->queue_bind('orders.dead', 'orders.dlx', 'order.failed');Menjalankan Proses Pekerja di Produksi
Berikut beberapa aturan operasional penting untuk proses pekerja PHP RabbitMQ:
- Jalankan konsumen sebagai proses CLI berumur panjang di bawah pengawas (systemd / Supervisor) yang memulai ulang proses tersebut saat berhenti.
- PHP mengalami kebocoran memori seiring waktu — mulai ulang proses pekerja setelah N pesan atau setelah melewati ambang memori tertentu.
- Kirim sinyal denyut AMQP dan tangani
SIGTERMuntuk penghentian bertahap (selesaikan pesan yang sedang diproses, lalu berhenti). - Gunakan antrian kuorum untuk HA, bukan antrian cermin lama.
Penghentian Bertahap
Proses penerapan mengirim SIGTERM. Proses pekerja sederhana dapat berhenti di tengah pesan, sehingga pesan harus dikirim ulang. Pasang penangan sinyal yang mengubah sebuah penanda; selesaikan pesan saat ini, konfirmasikan, lalu keluar dari loop konsumsi dengan bersih. pcntl_async_signals(true) memungkinkan PHP mengirimkan sinyal di antara waktu tunggu AMQP.
<?php
pcntl_async_signals(true);
$running = true;
pcntl_signal(SIGTERM, function () use (&$running) {
$running = false; // stop after the current message
echo "SIGTERM: draining...\n";
});
while ($running && $ch->is_consuming()) {
try {
$ch->wait(null, false, 5); // wakes for signals
} catch (\PhpAmqpLib\Exception\AMQPTimeoutException $e) {
// idle tick - loop and re-check $running
}
}
$ch->close();
echo "Stopped cleanly\n";Pemeriksaan Singkat
Bertahan setelah server perantara dimulai ulang.
Rangkuman
Sekarang Anda dapat membangun alur kerja RabbitMQ yang nyata di PHP:
- Terbitkan ke sebuah pertukaran; rutekan melalui pengikatan ke antrian.
- Antrian tahan lama + pesan persisten dapat bertahan setelah dimulai ulang.
- Konsumsi dengan konfirmasi manual dan sesuaikan prefetch basic_qos untuk distribusi adil.
- Gunakan konfirmasi penerbit untuk pengiriman terjamin dan DLX untuk pesan beracun.
- Jalankan proses pekerja di bawah pengawas dengan sinyal denyut dan penghentian bertahap.
Berikutnya: Kafka, saat Anda memerlukan aliran data ber-throughput tinggi, bukan pengantrean tugas.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Bekerja dengan RabbitMQ di PHP” gratis?
Ya — teks lengkap “Bekerja dengan RabbitMQ di PHP” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Bekerja dengan RabbitMQ di PHP”?
Terbitkan dan konsumsi pesan dengan RabbitMQ. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Bekerja dengan RabbitMQ di PHP” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Pesan Asinkron
- Bekerja dengan RabbitMQ di PHP
- Apache Kafka dengan PHP
- Membangun Alur Kerja Berbasis Peristiwa