1. Ön eğitim

Aşağıdaki bölümleri anlamak için önce lütfen ilgili bilgileri okuyun

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.