Supersord/SQS ile Laravel 4'ü çalıştırıyoruz ve 10'dan fazla çalışan işlemi kullanarak çalıştırılan 30'dan fazla farklı görevimiz var. Her şey çok iyi gidiyor, ancak belli görevlerin zaman aşımına uğradığı görülüyor. Böyle bir istisna olsun:Laravel kuyruğunda çalışırken çalıştırılan şu anki görevi alın:
[Symfony\Component\Process\Exception\ProcessTimedOutException]
The process ""/usr/bin/php5" artisan queue:work --queue="https://sqs.us-east- 1.amazonaws.com/xxxx" --delay=0 --memory=128 --sleep=3 --tries=0 --env=development" exceeded the timeout of 180 seconds.
Bunu kullanarak bu istisnayı yakalamak:
App::error(function(Symfony\Component\Process\Exception\ProcessTimedOutException $exception) {
/// caught!
});
Ben HANGİ görev için zamanında ediliyor belirlemek gibi olamaz Ancak (zaman aşımı oluştuğunda) ve hatta daha iyi ben istisna nesne yığın izini giriş denedi
göreve geçirildi veri .. erişebilir eğer:
$exception->getTraceAsString()
Ancak, bu bana çağrılan görev hakkında yeterince ayrıntı getirmiyor.
GÜNCELLEME nasıl php artisan queue:listen
çalışmalarına daha fazla araştırma yapmış
. Bazı referanslar:
, sen php artisan queue:listen
çağırdığınızda, (Symfony'nin/Bileşen/Proses kullanarak) ALT SÜREÇ oluşturulur esasen komutu çalıştırır php artisan queue:work
. Bu alt süreç bir sonraki işi kuyruktan alır, çalıştırır, tamamlandığında raporlar ve daha sonra Dinleyici bir sonraki işi ele almak için başka bir alt süreci ortaya çıkarır.
Alt işlemlerden biri belirlenen zaman aşımı sınırından uzun sürüyorsa, PARENT Listener bir istisna atar, ancak üst örnekte oluşturduğu alt işlem hakkında veri yoktur. İĞNE BİR HARCAMA İLE! Ana Dinleyici DOES'un alt işlemi 'çıktısını aldığını görüyoruz. Bana göre ebeveyn, alt süreci (işçi) çıktısını konsola getirmekten başka bir şey yapmıyor. Ancak, belki de bu çıktıyı yakalamanın bir yolu vardır, böylece bir istisna atıldığında, çıktıyı kaydedebiliriz ve bu nedenle zaman aşımı gerçekleştiğinde hangi görevin çalıştığı hakkında bilgi sahibi olabiliriz!
Ayrıca, supervisord kullanırken, tüm çalışan çıktılarını kaydeden bir stdout_logfile
belirtebildiğimizi fark ettik. Şu anda tüm 10 süpervizörümüzün "programları" için tek bir günlük dosyası kullanıyoruz. Bunu, her bir "program" ın kendi günlük dosyası olarak kullanması için değiştirebilirdik ve belki de zaman aşımı istisnası ana Dinleyici'ye atıldığında, bu günlük dosyasının son 10 satırını alabilirdik. Bu ayrıca zaman aşımı sırasında hangi görevlerin çalıştırıldığına dair bilgi verir. Ancak, hangi denetleyici programın çalıştığı ana Dinleyiciyi "nasıl bilgilendireceğimi" bilmiyorum, böylece hangi günlük dosyasına bakılacağını biliyor!
Sık sık yeterli olur - hızlı bir hata ayıklama için - "Görev X başlatılıyor" ve "Görev X bitti". Sonra zaman aşımı oluştuğunda - hangi görevin bitmediğine bakın ... – Laurence
@TheShiftExchange maalesef bu pek yardımcı olmaz. Çok sık zaman aşımı oluşur, ancak iş hala tamamlanır ve hala "Görev X bitti" mesajını günlüğe kaydeder. – phirschybar
Aslında - bu bize çok şey anlatmıyor mu? Bu yüzden çağrılan görevi yakalayamıyorsunuz - çünkü görev tamamlandı mı? Yani sorun görev dışında mı yatıyor? – Laurence