0Pricing
PHP Academy · Ders

PHP'te RabbitMQ ile Çalışma

RabbitMQ ile iletileri yayımlayın ve tüketin.

PHP'te RabbitMQ ile Çalışma, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

PHP'de RabbitMQ

RabbitMQ, AMQP 0-9-1 konuşan bir aracıdır. PHP'de yaygın istemci, saf PHP ile yazılmış php-amqplib/php-amqplib veya C destekli ext-amqp'dir. Bu derste php-amqplib kullanılır; çünkü Composer'ın çalıştığı her yerde çalışır.

Temel AMQP modelinde üç aktör vardır: değiş tokuşlar mesajları alır, bağlamalar bunları anahtara göre yönlendirir ve kuyruklar tüketiciler için tutar. Bunu öğrenirseniz geri kalan ayrıntılardan ibarettir.

İstemciyi Yükleme

Kitaplığı Composer ile ekleyin. Hem CLI PHP derlemelerinde yaygın olan sockets hem de bcmath uzantılarına ihtiyaç duyar.

composer require php-amqplib/php-amqplib
# Connection target, e.g. amqp://guest:guest@localhost:5672/

Değişim/Kuyruk/Bağlama Modeli

Üreticiler doğrudan kuyruğa değil, bir değiş tokuşa yayın yapar. Yönlendirmeyi değiş tokuş türü belirler:

  • direct — yönlendirme anahtarıyla tam eşleşme.
  • topic — order.*.eu gibi joker karakterli kalıplar.
  • fanout — bağlı tüm kuyruklara yayın.
  • headers — üstbilgi özniteliklerine göre eşleştirme.

Bir bağlama, bir kuyruğu bir değiş tokuşa yönlendirme kalıbıyla bağlar. Üreticileri kuyruk topolojisinden ayırmak, değişim katmanının varlık nedenidir.

Bağlanma ve Tanımlama

Bir bağlantı açın, bir kanal alın ve topolojinizi tanımlayın. durable: true, değişim/kuyruğun aracı yeniden başlatıldığında da varlığını sürdürmesini sağlar. Tanımlamalar tekrarlanabilir niteliktedir — the mevcut bir varlığı eşleşen bağımsız değişkenlerle tanımlamak hiçbir işlem yapmaz.

<?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();

Mesaj Yayımlama

Gövdeyi bir AMQPMessage içine sarın. Mesajı kalıcı yapmak için delivery_mode = 2 değerini ayarlayın — yeniden başlatma sonrasında varlığını sürdüren şey, kalıcı kuyruk ile kalıcı mesajın birlikte kullanılmasıdır; tek başına biri bunu sağlayamaz.

<?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();

El İle Onaylayarak Tüketme

basic_consume ile bir geri çağırma işlevi kaydedin. Onaylamayı sizin denetlemeniz için no_ack = false geçin. Yalnızca iş başarıyla tamamlandıktan sonra onaylayın; hata durumunda, yeniden kuyruğa alma ile basic_nack kullanmak RabbitMQ'nun mesajı yeniden teslim etmesini sağlar.

<?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();
}

Önceden Getirme ve Adil Dağıtım

RabbitMQ varsayılan olarak, her tüketicinin ne kadar meşgul olduğunu dikkate almadan mesajları tüketicilere sırayla dağıtır — yavaş bir tüketicide işler birikir. basic_qos(null, prefetch, null), bir tüketicinin tutabileceği onaylanmamış mesaj sayısını sınırlar.

Ağır ve dengesiz görevler için önceden getirme sayısını küçük bir değere (ör. 1–10) ayarlayın; böylece aracı yeni işleri yalnızca boş kapasitesi olan tüketicilere gönderir. Buna adil dağıtım denir.

Yayımcı Onayları

basic_publish hemen döner ve aracıya mesajı kabul edip etmediğini bildirmez. Garantili yayımlama için yayımcı onaylarını etkinleştirin: aracı, mesaj güvenli biçimde kalıcı hâle getirildiğinde veya yönlendirildiğinde bir onay gönderir.

<?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 timeout

Ölü Mektup İşleme

Bir kuyruğun x-dead-letter-exchange bağımsız değişkenini, reddedilen (nack yeniden kuyruğa alma olmadan) veya süresi dolan mesajların bir DLX'e yönlendirilmesini sağlayacak şekilde yapılandırın. Yeniden denemeleri otomatik olarak sınırlamak için bunu çekirdek kuyruklarında x-delivery-limit ile birleştirin.

<?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');

Üretimde İşçi Süreçlerini Çalıştırma

PHP RabbitMQ işçileri için edinilmiş birkaç operasyonel kural:

  • Tüketicileri, çıkış yaptıklarında yeniden başlatan bir süreç yöneticisi (systemd / Supervisor) altında uzun ömürlü CLI süreçleri olarak çalıştırın.
  • PHP zamanla bellek sızıntısına uğrar — N mesajdan sonra veya bir bellek eşiğine ulaşıldığında işçiyi yeniden başlatın.
  • AMQP kalp atışlarını gönderin ve kontrollü kapanma için SIGTERM sinyalini işleyin (devam eden mesajı tamamlayın, ardından durun).
  • Eski yansıtılmış kuyruklar yerine HA için çekirdek kuyruklarını kullanın.

Kontrollü Kapanma

Dağıtımlar SIGTERM gönderir. Basit bir işçi mesajın ortasında ölür ve mesajın yeniden teslim edilmesine neden olur. Bir sinyal işleyicisi kurup bir bayrağı değiştirin; mevcut mesajı tamamlayın, onaylayın ve ardından tüketim döngüsünden temiz bir şekilde çıkın. pcntl_async_signals(true), PHP'nin sinyali AMQP beklemeleri arasında iletmesini sağlar.

<?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";

Hızlı Kontrol

Bir aracının yeniden başlatılmasından sağ çıkma.

Özet

Artık PHP ile gerçek bir RabbitMQ işlem hattı oluşturabilirsiniz:

  • Bir değişime yayımlayın; bağlamalar aracılığıyla kuyruklara yönlendirin.
  • Kalıcı kuyruk + kalıcı mesaj yeniden başlatmalardan sağ çıkar.
  • El ile onay kullanarak tüketin ve adil dağıtım için basic_qos prefetch değerini ayarlayın.
  • Garantili gönderimler için yayımcı onaylarını, işlenemeyen mesajlar için bir DLX kullanın.
  • İşçileri kalp atışları ve kontrollü kapanma ile bir süreç yöneticisi altında çalıştırın.

Sırada: Görev kuyruğa alma yerine yüksek aktarım hızlı akış gerektiğinde Kafka.

Sıkça Sorulan Sorular

“PHP'te RabbitMQ ile Çalışma” dersi ücretsiz mi?

Evet — “PHP'te RabbitMQ ile Çalışma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“PHP'te RabbitMQ ile Çalışma” dersinde ne öğreneceğim?

RabbitMQ ile iletileri yayımlayın ve tüketin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“PHP'te RabbitMQ ile Çalışma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Eşzamansız Mesajlaşma Neden Önemlidir
  2. PHP'te RabbitMQ ile Çalışma
  3. PHP ile Apache Kafka
  4. Olay Odaklı İş Akışları Oluşturma
← PHP Academy Sayfasına Dön