1. Ön eğitim
Aşağıdaki bölümleri anlamak için önce lütfen ilgili bilgileri okuyun
- RabbitMQ Temel Kavramlar
- RabbitMQ Tema Deseni İlkesi
- PHP RabbitMQ Hızlı Başlangıç Bölümü (gereklidir, çünkü sonraki bölümler kodları tekrar etmeyecek, sadece önemli kodları gösterecek)
- PHP RabbitMQ Yayın/Abonelik Deseni Bölümü (gereklidir, çünkü kod neredeyse aynı, sadece değişen exchange tipi ve yönlendirme parametreleri var)
2. Konu Exchange'ini Tanımla
// Exchange'i tanımla
$channel->exchange_declare(
'tizi365.topic', // Exchange adı, benzersiz olmalı, tekrarlanmamalı
'topic', // Exchange tipi
false,
false, // Dayanıklı olup olmadığı
false
);
Not: Hem mesaj üreticileri hem de tüketicileri değişimlere ihtiyaç duyar.
3. Mesaj Gönderme
Mesajları değişime göndeririz ve değişim yönlendirme kurallarına göre ilgili kuyruklara mesajları iletir.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Bir rabbitmq bağlantısı oluşturma
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Kanal oluşturma
$channel = $connection->channel();
// Exchange'i tanımla
$channel->exchange_declare(
'tizi365.topic', // Exchange adı, benzersiz olmalı, tekrarlanmamalı
'topic', // Exchange tipi
false,
false, // Dayanıklı olup olmadığı
false
);
// Mesaj nesnesi, parametre olarak mesaj içeriğini alır
$msg = new AMQPMessage("merhaba tizi365.com");
// Mesaj gönderme
// Üçüncü parametreye dikkat, yönlendirme parametresi
$channel->basic_publish(
$msg, // Mesaj nesnesi
'tizi365.topic', // Exchange adı
"www.tizi365.com" // Yönlendirme parametresi, gereksinimlere göre isteğe bağlı olarak tanımlanabilir
);
echo ' [x] Gönderildi ', $msg->getBody(), "\n";
// Kaynakları serbest bırak
$channel->close();
$connection->close();
4. Mesaj Alımı
4.1. Kuyruğu Tanımla ve Değişim Bağla
Kuyruk mesajlarını tüketmek için önce bir kuyruk tanımlamanız ve daha sonra kuyruğu hedef değişime bağlamanız gerekir.
// Anonim bir kuyruk tanımla
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Kuyruğu belirtilen değişime bağla
$channel->queue_bind(
$queue_name, // Kuyruk adı
'tizi365.topic', // Değişim adı
"*.tizi365.com" // Bağlama yönlendirme parametresi, burada tek kelime eşleştirebilen yıldız (*) joker karakterini kullanıyor
Not: Belirtilen yönlendirme parametreleri hepsi tek kelime eşleştirebilen * (yıldız) joker karakterini kullanır. # (diyez) olarak değiştirilirse, birden fazla kelime eşleştirebilir.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// Rabbitmq bağlantısı oluştur
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Bir kanal oluştur
$channel = $connection->channel();
// Bir değişim tanımla
$channel->exchange_declare(
'tizi365.topic', // Değişim adı, benzersiz olmalı ve tekrarlanmamalı
'topic', // Değişim türü
false,
false, // Dayanıklı olup olmadığı
false
);
// Anonim bir kuyruk tanımla
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Kuyruğu belirtilen değişime bağla
$channel->queue_bind(
$queue_name, // Kuyruk adı
'tizi365.topic', // Değişim adı
"*.tizi365.com" // Bağlama yönlendirme anahtarı, burada tek kelime eşleştirebilen yıldız (*) joker karakterini kullanıyor
);
echo " [*] Mesaj bekleniyor. Çıkmak için CTRL+C'ye basın\n";
// Mesaj işleme fonksiyonunu tanımla (burada anonim bir fonksiyon kullanılıyor)
$callback = function ($msg) {
// Mesaj işleme mantığı
echo ' [x] ', $msg->body, "\n";
};
// Bir tüketici oluştur
$channel->basic_consume(
$queue_name, // Tüketilecek kuyruk adı
'', // Tüketici etiketi, ihmal edilirse otomatik olarak benzersiz bir kimlik oluşturulur
false,
true, // Mesajı otomatik olarak onaylamak için, yani, rabbitmq'ya mesajın başarılı bir şekilde işlendiğini otomatik olarak bildirmek için
false,
false,
$callback // Mesaj işleme fonksiyonu
);
// Kanal kapatılmadıysa, işlem çıkışını önlemek için sürekli olarak işlemi engelle
while ($channel->is_open()) {
$channel->wait();
}
// Kaynakları serbest bırak
$channel->close();
$connection->close();
Çünkü değişimi bağlarken belirlenen yönlendirme parametresi *.tizi365.com, mesajın yönlendirme parametresi (www.tizi365.com) ile eşleştiği için mesaj alınabilir.