PHP ile Apache Kafka
Kafka kullanarak yüksek aktarım hızlı olayları akış olarak işleyin.
PHP ile Apache Kafka, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. 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 ile Kafka
Kafka bir görev kuyruğu değildir — dağıtık, yalnızca eklemeli bir işlem günlüğüdür. Üreticiler kayıtları konulara ekler; tüketiciler kendi ofsetlerinden okur ve geçmişi yeniden oynatabilir. Bu özellik, Kafka'yı yüksek aktarım hızlı olay akışları, olay kaynaklandırma ve tek bir akıştan birden çok bağımsız tüketici grubunu besleme için ideal kılar.
PHP'de Kafka ile, kendini kanıtlamış C kitaplığı librdkafka üzerine kurulmuş bir bağlayıcı olan ext-rdkafka aracılığıyla iletişim kurarsınız.
Kuyruk Değil, Günlük
RabbitMQ'dan Kafka'ya geçişteki the zihinsel değişim:
- Mesajlar tüketildiklerinde silinmez; saklama politikasına göre (zamana veya boyuta bağlı olarak) süreleri dolar.
- Her tüketici kendi ofsetini — günlükteki konumunu — izler.
- Bir konu bölümlere ayrılır; sıralama yalnızca bir bölüm içinde garanti edilir.
- Birden çok tüketici grubu aynı konuyu birbirinden bağımsız olarak okur.
Yeniden oynatma, çok sayıda okuyucuya dağıtım veya çok yüksek aktarım hızı gerekiyorsa Kafka uygundur. Mesaj başına yönlendirme ve TTL'ler gerekiyorsa RabbitMQ uygundur.
ext-rdkafka Uzantısını Kurma
Önce the yerel kitaplığı, ardından PECL uzantısını ve isteğe bağlı olarak daha üst düzey bir sarmalayıcıyı kurun.
# Debian/Ubuntu
apt-get install -y librdkafka-dev
pecl install rdkafka
echo "extension=rdkafka.so" >> php.ini
# Optional ergonomic wrapper
composer require longlang/phpkafka # or arnaud-lb/php-rdkafka-stubs for IDEKayıt Üretme
Bir RdKafka\Producer oluşturun, bir konu tutamacı alın ve produce() çağrısını yapın. the Anahtar, kaydın hangi bölüme yerleşeceğini belirler — aynı anahtar aynı bölüme gider ve sıralama korunur. Çıkmadan önce her zaman flush() çağrısını yapın; yoksa arabelleğe alınmış kayıtları kaybedersiniz.
<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$producer = new RdKafka\Producer($conf);
$topic = $producer->newTopic('orders');
// RD_KAFKA_PARTITION_UA = let the partitioner choose by key
$key = 'order-42';
$topic->produce(RD_KAFKA_PARTITION_UA, 0, json_encode(['id' => 42]), $key);
$producer->poll(0);
$result = $producer->flush(10000); // wait up to 10s
if ($result !== RD_KAFKA_RESP_ERR_NO_ERROR) {
throw new RuntimeException('Failed to flush');
}Anahtara Göre Bölümlendirme
Bölümlendirme, Kafka'nın ölçeklenebilirliğinin ve sıralamasının temelidir. Varsayılan bölümlendirici, kayıt anahtarının özetini çıkarır: partition = hash(key) % numPartitions. İyi bir anahtar seçmek önemlidir:
customerIdile anahtarlama → bir müşterinin tüm olayları sıralı kalır ve tek bir bölümde bulunur.- Boş anahtar → bölümler arasında sırayla dağıtım (en yüksek aktarım hızı, sıralama yok).
Bir konunun bölüm sayısını hiçbir zaman azaltamazsınız; ayrıca bölüm eklemek özet eşlemesini yeniden düzenler. Bu nedenle bölümleri en yüksek paralellik gereksinimine göre baştan boyutlandırın.
Tüketici Grupları ve Ofsetler
Üst düzey KafkaConsumer ile birlikte group.id kullanın. Kafka, bölümleri grubun üyelerine dağıtır ve üyeler katıldığında veya ayrıldığında yeniden dengeleme yapar. Her üye yalnızca kendisine atanmış bölümleri okur; böylece ek çaba olmadan yatay ölçekleme elde edersiniz.
<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->set('group.id', 'order-emailers');
$conf->set('auto.offset.reset', 'earliest'); // start of log if no offset
$conf->set('enable.auto.commit', 'false'); // we commit manually
$consumer = new RdKafka\KafkaConsumer($conf);
$consumer->subscribe(['orders']);
while (true) {
$msg = $consumer->consume(5000);
if ($msg->err === RD_KAFKA_RESP_ERR_NO_ERROR) {
handle($msg->payload);
$consumer->commit($msg); // commit offset AFTER work
}
}
function handle(string $p): void {}Ne Zaman Onaylanmalı
Ofsetin onaylanması, teslim semantiğini belirler:
- İşlemeden sonra onaylama → en az bir kez (onaylamadan önceki bir çökme kaydı yeniden oynatır).
- İşlemeden önce onaylama → en fazla bir kez (bir çökme kaydı kaybettirir).
Otomatik onaylama (enable.auto.commit=true), işinizin tamamlanıp tamamlanmadığına bakmaksızın zamanlayıcıya göre onaylar — kullanışlıdır, ancak çökme sırasında kayıtları sessizce kaybettirebilir. Bunu devre dışı bırakın ve doğruluğun önemli olduğu durumlarda el ile onaylayın.
Tüketim Hatalarını Ele Alma
consume() işlevinden dönen her sonuç bir mesaj değildir. Hata koduna göre dallanmanız gerekir — __PARTITION_EOF ve __TIMED_OUT başarısızlık değil, normal denetim sinyalleridir.
<?php
$msg = $consumer->consume(2000);
switch ($msg->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
echo "Got: {$msg->payload} @ offset {$msg->offset}\n";
break;
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
echo "Reached end of partition\n"; // caught up, keep polling
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
echo "No message this poll\n";
break;
default:
throw new \Exception($msg->errstr(), $msg->err);
}Aktarım Hızını Ayarlama
Kafka'nın aktarım hızı toplu işlemeden gelir. Temel üretici ayarları:
linger.ms— istek başına daha fazla kaydı toplu işlemek için kısa süre bekler (ör. 5–20 ms).batch.size/queue.buffering.max.messages— daha büyük arabellekler ve daha az gidiş-geliş.compression.type—lz4veyazstd, ağ maliyetini büyük ölçüde azaltır.acks— kalıcılık içinall, daha düşük gecikme için1.
<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->set('compression.type', 'lz4');
$conf->set('linger.ms', '10');
$conf->set('batch.size', '65536');
$conf->set('acks', 'all');
$producer = new RdKafka\Producer($conf);Teslim Raporu Geri Çağırmaları
produce() zaman uyumsuz olduğundan başarısız bir gönderim anında hata oluşturmaz. Her kaydın akıbetini öğrenmek için üretici yapılandırmasına bir teslim raporu geri çağırması kaydedin — PHP'de sessiz üretici hatalarını algılamanın tek güvenilir yolu budur.
<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->setDrMsgCb(function ($producer, $msg) {
if ($msg->err) {
fwrite(STDERR, 'Delivery FAILED: ' . rd_kafka_err2str($msg->err) . "\n");
} else {
echo "Delivered to partition {$msg->partition} @ offset {$msg->offset}\n";
}
});
$producer = new RdKafka\Producer($conf);
// poll() services the callback queue; call it after producing
$producer->poll(0);PHP'ye Özgü Tuzaklar
Kafka uzun ömürlü istemcileri varsayar; PHP'nin istek yaşam döngüsü ise buna ters düşer:
- Üreticiler zaman uyumsuz olarak arabelleğe alır — betik sona ermeden önce her zaman
flush()çağrısını yapın; yoksa kayıtlar kaybolur. - Tüketicileri bir süreç yöneticisi altında kalıcı CLI işçileri olarak çalıştırın; bunları hiçbir zaman bir web isteğinin içinde çalıştırmayın.
- Yeniden dengelemeler tüketimi duraklatır; gruptan çıkarılmamak için mesaj başına işinizi kısa tutun veya
max.poll.interval.msdeğerini cömertçe ayarlayın. - Sessiz hataları yakalamak için
log_leveldeğerini ayarlayın ve üreticinin teslim raporu geri çağırmasını kaydedin.
Hızlı Kontrol
Kafka'da sıralama garantileri.
Özet
PHP yaklaşımıyla Kafka:
- Kafka bir kuyruk değil, yeniden oynatılabilir bir günlüktür; tüketiciler ofsetleri izler.
- Anahtara göre bölümlendirme, anahtar başına sıralama ve ölçekleme sağlar.
- Tüketici grupları bölümleri paylaşır ve otomatik olarak yeniden dengelenir.
- En az bir kez teslim için ofsetleri işten sonra onaylayın; denetim için otomatik onaylamayı devre dışı bırakın.
linger.ms,batch.sizevecompression.typedeğerlerini ayarlayın; her zamanflush()çağrısını yapın.
Sırada: Bu temel yapı taşlarını güvenilir, olay odaklı iş akışlarına bağlamak.
Sıkça Sorulan Sorular
“PHP ile Apache Kafka” dersi ücretsiz mi?
Evet — “PHP ile Apache Kafka” 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 ile Apache Kafka” dersinde ne öğreneceğim?
Kafka kullanarak yüksek aktarım hızlı olayları akış olarak işleyin. 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 3. dersidir.
“PHP ile Apache Kafka” 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
- Eşzamansız Mesajlaşma Neden Önemlidir
- PHP'te RabbitMQ ile Çalışma
- PHP ile Apache Kafka
- Olay Odaklı İş Akışları Oluşturma