Laravel'de Failed Jobs Komutları ve Failed Jobs Listesi Oluşturma

586

Normalde geliştirilmesi bitmeyen, sürekli yeni özellikler eklenen bir projeyle çalışıyorsanız bilgisayarda sürekli bir veritabanı yöneticisinin açık olması bir çok işi gerçekten hızlandırabiliyor. Bu durumda eğer PHPStorm kullanıyorsanız kendi içindeki veritabanı yöneticisi birçok işinizi görebilir. Doğrusu DataGrip gibi sadece o iş içi özelleşmiş bir uygulama kullanmak. Ama siz benim gibi olmayın diye siz en has öz doğrusunu da yazayım. Veritabanı yöneticisini hiç kullanmamak.

Veritabanındaki her tablo ya da yapacağınız her işe bir model yazmanız en doğrusu. Bu modelleri her kullanıcının kullanımına açmanıza gerek de yok. Gerekli güvenlik önlemlerini alarak acil durumlar bu sayfaları yazmanın faydanıza olacağını düşünüyorum.

Geçen günlerde buna benzer bir durumu yaşayınca kolları sıvadım ama o kadar da sıvamadım, kodların bir kısmını size bırakacağım. Laravel'de bir işi sıraya koyuyorsanız, arada sıraya konan işin bir hata sonrasında "fail" olması oldukça yaygın bir durumdur. Korkmanıza gerek yok. Başarısız olan işi tekrar sıraya alabilirsiniz. Ama tecrübelerle sabittir ki o işin neden başarısız olduğuna bakmak, gerçekleşebilecek saçma bir hataya daha erken müdahale etmenizi sağlayabilir.

Öncelikle bir jobs ve failed_jobs tablonuz olduğunu, ve halihazırda queue işlemlerini yaptığınızı varsayıyorum. Bu varsayımla size bazı komut ve kodları hatırlatmak istiyorum.

"failed_jobs" tablonuzdaki fail olan tüm işleri görebilmek için:

php artisan queue:failed

Bu listede işleri ve o işlere verilen job ID'leri görebilirsiniz. ID'si asd123asd-asd1-1234-321a-123456asdqwe gibi bir şey olduğunu varsayalım. Başarısız olan sadece bu işi yeniden sıraya koymak için aşağıdaki komutu kullanabilirsiniz.

php artisan queue:retry asd123asd-asd1-1234-321a-123456asdqwe

Birden çok işi de tekrardan listeye ekleyebilirsiniz:

php artisan queue:retry asd123asd-asd1-1234-321a-123456asdqwe zxc123qwe-ghj1-12as-321a-qwezxc321654

Sadece adlandırılmış bir kuyruğu tekrar listeye alabilirsiniz:

php artisan queue:retry --queue=name

Hepsini tekrardan listeye alabilirsiniz:

php artisan queue:retry all

Ya da belli bir işi Laravel'e unutturabilirsiniz:

php artisan queue:forget 91401d2c-0784-4f43-824c-34f94a33c24d

Ya da failed_jobs tablonuzdaki tüm başarısız işleri bu tablodan silebilirsiniz:

php artisan queue:flush

Bu komutlar iyi hoş ama dikkat ettiyseniz bunları kullanmak için sunucumuza bağlı bir komut istemcisini kullandık. Ama hali hazırda failed_jobs tablonuzdaki başarısız işleri yönetici panelimizde göremedik. Hiç açıp baktırınız mu bilmiyorum ama bu hata raporlarının oldukça okunaksız olduğunu söyleyebilirim. Bu problemi bir nebze de olsa aşabilmek için bunun için hazırlayacağımız bir view bizi veritabanı yöneticilerinden kurtarabilir. Size fikir vermesi açısından da listelemeyi yapabileceğiniz basit bir kod örneğini ağaıya ekliyorum.

@php
    $failed_jobs =\Illuminate\Support\Facades\DB::table('failed_jobs')->get();
@endphp

@forelse($failed_jobs as $job)
    <strong>ID:</strong> {{ $job->id }} <br>
    <strong>UUID:</strong> {{ $job->uuid }} <br>
    <strong>Queue:</strong> {{ $job->queue }} <br>
    <strong>Failed at:</strong> {{ $job->failed_at }} <br>
    <pre>
        @php
            $decoded = json_decode($job->payload);
            dump($decoded->displayName, $job->exception, unserialize($decoded->data->command));
        @endphp
    </pre>
    <hr>
@empty
    Başarısız olan iş yok.
@endforelse

Dikkat ederseniz değişkenlerimizi herhangi bir model ya da controller aracılığıyla almadık. Bilerek view dosyasına yazdım ki normalde olmayan failed_jobs ve jobs işleri için bir model ya da controller hazırlayacaksanız kendi ihtiyaçlarınıza göre bunları düzenleyin. Buradaki verilere göre ya da ID'ye ya da UUID'ye göre işelm yapabilirsiniz ya da kendi controller'larınızı yazıp direkt yukarıdaki örneklere göre Artisan komutlarınızı yazabilirsiniz.