Gönderen Konu: Adil İlhan: PHP – Redis ile Pub/Sub İşlemi  (Okunma sayısı 6474 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı fortran

  • Forum Gurusu
  • *****
  • İleti: 1.671
  • Bir insanı sevmekle başlar her şey...
    • get GNU
Adil İlhan: PHP – Redis ile Pub/Sub İşlemi
« : 06 Aralık 2013, 07:12:44 ös »
Redis, kendi içerisinde pub/sub (publish/subscribe) yapılmasına olanak sağlıyor.

Peki pub/sub pattern nedir?

Pub/sub pattern (desen), mesajlaşma pattern’ı olarak geçer. Temelinde; takip edilen bir olayın, takipçilere duyurulması yatar.

Gerçek hayattan örnek verirsek: Öğretmen publish (pub) görevini üstlenir. Öğrenciler ise subscribe (sub) görevini üstlenir. Öğretmen sınav sonuçlarını panoya asar. Öğrenciler de sınav sonucunu bekledikleri için sürekli gözleri panoda bir haber beklerler.

Öncelikle öğretmen görevini yani pub kısmına gözatalım:

pub.php

Kod: [Seç]
$teacher = new Predis\Client(array('host' => '127.0.0.1'));
 
$teacher->publish('Pano', 'Ali, sinavdan AA aldin.');

Gördüğünüz gibi öğretmen Pano’ya Ali isimli öğrencinin sınav bilgisini girdi. Ali de Pano kanalına (channel) aktif olarak abone.

Ali isimli öğrenci Pano kanalını ise şöyle dinleyebiliyor:

sub.php

Kod: [Seç]
ini_set("default_socket_timeout", -1); // Ilgili socket surekli dinleniyor
 
$client = new Predis\Client(array('host' => '127.0.0.1'));
 
$redis = new Predis\PubSub\DispatcherLoop($client);
 
$redis->attachCallback('Pano', 'showResult');
 
$redis->run();
 
function showResult($data) {
    static $i = 0;
    echo ++$i . '. ogrencinin sonucu aciklandi: ' . $data . PHP_EOL;
}

Deneme yapabilmek için öncelikle sub.php dosyasını ardından pub.php dosyasını çalıştırın. Böylece ilk önce kullanıcıyı Pano isimli kanala abone ediyorsunuz ve artık Pano’dan gelecek mesaajı ekrana basmaya hazır oluyor. Daha sonra pub.php ile Pano‘ya veri giriyorsunuz.

pub.php dosyasını biraz genişletelim. Öğretmen daha çok sınav sonucu açıklasın.

Kod: [Seç]
$teacher = new Predis\Client(array('host' => '127.0.0.1'));
 
$students = array('Ali', 'Ayse', 'Veli', 'Hasan', 'Fatma', 'Oguz');
$results = array('AA', 'BA', 'DC', 'CC', 'AA', 'BA');
 
for($i = 0; $i < 6; $i++) {
    $teacher->publish('Pano', $students[$i] . ', sinavdan ' . $results[$i] . ' aldin.');
    sleep(1);
}

Yeni pub.php dosyası ile öğretmen, iki dizideki verileri eşleştirerek birer saniye aralıklarla Pano’ya sınav sonuçlarını koyuyor.

Ayrıca bkz.: Observer Design Pattern

adililhan.com