Laravel Kuyruk (Queue) İşlemleri ve Async
Kısaca kuyruk olayını anlatıyım isterseniz.. Kuyruk yada ingilizcesi Queue dediğimiz olay yaptırmak istediğimiz işlemleri belirli bir sıraya koyup istediğimiz bir zamanda, belirli bir sıraya göre yaptırma olayıdır.. Yani şöyle bir örnek vericek olursak;
Örnek olarak bir blog oluşturdunuz ve her yazıdan sonra sisteme kayıtlı kullanıcılara toplu mail atmanız gerekmekte.. Bu işlemi normal olarak yazı ekle fonksiyonundan hemen sonra tüm kullanıcılara mail atmasını söylersiniz. Fakat bu işlemi eski usüllerde yaptığınız da bekleme süresi artıcak, hatta timeout’a kadar düşecektir.
Yaptırmak istediğimiz tüm kullanıcılara mail atmaksa bunu bir iş kuyruğuna dizip, iş kuyruğunu kendi işlemimizin haricinde arkaplanda yapılmasını sağlarız.
Türkçe olarak: http://laravel.gen.tr/docs/queues
Yada http://laravel.com/docs/queues
—
Peki kuyruk olayını nasıl kullanıyoruz?
Queue sıralaması Laravel üzerinde oldukça kolay bir şekilde hazırlanmış ve kısaca şöyle bir kullanımı söz konusu..
1 2 3 4 5 6 7 8 9 10 11 12 |
public function chapter_ekle() { foreach ($cas $s) Queue::push('BotController@chapter_tek_ekle', array( 'link' => $s->link, 'chapter' => $s->id, )); } } |
Örnek olarak elimde bulunan 50 tane linki foreach döngüsü içerisinde tek tek title bilgilerini okumam gerekiyordu.. HTML Dom da 50 sayfanın tek tek açılıp belirli bir sırada okunup diğerinin beklenmesi çok uzun zaman sürdüğünden hepsini belirli bir iş kuyruğuna dizip, sırasıyla okumasını istedim.
Push yaparken ek olarak
1 |
Queue::later($date, 'SendEmail@send', array('message' => $message)); |
Later değerine bir zaman ekleyebilirsiniz.
1 |
$date = Carbon::now()->addMinutes(15); |
Örnek olarak 15 dakika sonra bu değerin çalışmasını istiyorsunanız date değerine zaman tanımlayıp gönderebilirsiniz.. Kuyruktaki iş o zaman geldiğinde çalışıcaktır.
Kuyruğa eklediğimiz controller da ise;
1 2 3 4 5 6 |
public function chapter_tek_ekle($job, $data) { $baglan= new Htmldom($data['link']); $job->delete(); } |
array değişkeni olarak gönderdiğim link,chapter değişkenlerini data dizisnden alıp diğer işlemlerimi yaptıktan sonra görevi sildim. ( Job-delete)
—-
Ve artık artisan üzerinde queue:listen yaparak kuyrukta bekleyen işlemleri görebiliriz…
—-
Bu kısımdan sonrası için laravel bize 3-4 farklı seçenek sunuyor.. Bunlar beanstalk, ironmq, redis,amazon ve local olarak kullanabileceğimiz bir sistem…
Bu ayarları ise app/config/queue.php içerisinden ayarlamamız mümkün..
—-
IronMQ ile de oluşturduğunuz bir queue linkini tanımlayıp tüm kuyruklarınızı kaydedip belirtebilirsiniz. – http://laravel.gen.tr/docs/queues#push-queues
—-
Yada Alternatif olarak production aşamasında yani localde denediğimiz de
https://github.com/barryvdh/laravel-async-queue
Kullanabileceğimiz oldukça güzel bir paket mevcut..
—-
Async driverını tanımlayıp paketi kurduğumuz da sistem kuyruğa atılan verileri bir sql tablosunda toplayıp, sırayla oradan çalıştırıyor.. Ardından çalıştırdığı işlemi silip yeniden devam ediyor..
Yani yukarı da belirttiğimiz 50 linkin tek tek okunması olayı birbirinden bağımsız hale geldi.
Eski mantıkla yaptığımız 50 linki 1. okunur- eklenir 2.geçilir, 2.okunur eklenir 3.geçilir olarak yapılıyordu, yeni sistem de ise 50 linkte aynı anda Oku- Ekle olayına dönüştü..
Yada yazılım dilindeki ismiyle asenkron olarak çalıştırıldı..
Not: Async sistemi queue later olayını sleep tarzı bir sistemle yapıyor ve açıkcası çalışmıyor 🙂
Local dışında staging aşamasında Iron.io kullanarak yine aynı işlemi yapabilirsiniz.
Marshal ile kuyrukları bir sayfada tanımlayıp o sayfayı iron üzerinden belirli zaman dilimlerinde çalıştırabilirsiniz..
laravel ,laravel kuyruk işlemi ,laravel kuyruk kullanımı ,queue
“Yada Alternatif olarak production aşamasında yani localde denediğimiz de”
Localde mi yayın yapıyorsub Beyazıt?
Production = Üretim aşaması olduğu için ve genelde local olarak çalışıldığı için ondan dedim.
kaynak çok az türkçe geri kalanı da ingilizce ve ben php yi framework lerle çalışabilecek kadar bilmiyorum ama iş yerinden benden bir görev istendi hem formu post etsin ve ettikten sonrada ilgili kişilere mail gelsin hazır bir sistem var elimde ama sayfaya her girdiğimde mail gönderiyor