Uzun süre olan işlemler ziyaretçileri rahatsız edebilir veya işlem sürerken yarıda kesilebilir. Bu tür durum ve sorunların kontrolü için Laravel Jobs & Queue kullanmak avantajlıdır. Yapacağınız işlemler kayıt edilir ve belirteceğiniz zamanda bu işlem arkaplanda çalıştırılır. Örnek verecek olursak tüm üyelerinize toplu mail gönderirseniz bu işlem uzun sürecek, süreci takip edemez sadece tarayıcının işlemi bitmesini beklersiniz. Ayrıca mail gitmeyen kullanıcıları da göremezsiniz. Bu işlemi Laravel Jobs & Queue kullanarak rahatlıkla gerçekleştirebilirsiniz.
Mantık olarak ise şu şekilde süreç işliyor. Öncelikle yapacağınız işlem için Job oluşturulur.
php artisan make:job SendMyTestEmailJob
app\Jobs\SendMyTestEmail.php dosyasındaki handle metoduna yapacağınız işlem tanımlanır.
use Mail; use App\Mail\MyTestMail; // deneme mail sınıfı ... $to_email = 'info@example.com'; $details = [ 'title' => 'Mail from controller basligi', 'body' => 'This is for testing email using smtp' ]; Mail::to($to_email)->send(new MyTestMail($details));
Bu test maili Job işlemini nerede çalıştırmak isterseniz orada dispatch etmeniz gerekiyor. Örneğin TopluMailGondeController.php dosyamız var ise;
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Jobs\SendMyTestEmailJob; class TopluMailGonderController extends Controller { /** * Handle Queue Process */ public function sendBulkEmail() { $emailJob = new SendMyTestEmailJob(); dispatch($emailJob); // veya // use App\Jobs\SendMyTestEmailJob; SendMyTestEmail::dispatch($emailJob); } }
Queue ve jobs için tabloları oluşturmak için;
php artisan queue:table // (database/migrations CreateJobsTable için dosya oluşur) php artisan migrate
Ayrıca localde kullanılacaksa aşağıdaki komutları kullanmalısınız. Böylelikle Joblar sırayla arkaplanda çalıştırılır.
php artisan queue:work //job işlemi veri tabanından çalışır php artisan queue:work --once //işlemler 1 kere tetiklenir php artisan queue:listen --tries=3 // jobları 3 kere çalıştırma php artisan queue:failed // basarisiz jobları listeler php artisan queue:retry job_id // basarisiz jobu tekrar sıraya koyar
Sunucu ise supervisor kurmanız gerekmektedir.
Job işlemini belirli bir süre sonra da çalıştırabilirsiniz.
use Carbon\Carbon; public function processQueue() { $emailJob = new SendWelcomeEmail()->delay(Carbon::now()->addMinutes(5)); dispatch($emailJob); } // veya SendCouponEmail::dispatch() ->delay(now()->addSeconds(20)); // veya ProcessPodcast::dispatch($podcast) ->delay(now()->addMinutes(10));
*Zincirleme metodu kullanılarak başarısız Job işleminden sonra kuyruktaki işlemleri durdurabilirsiniz. Örnek kullanım.
use App\Jobs\OptimizePodcast; use App\Jobs\ProcessPodcast; use App\Jobs\ReleasePodcast; use Illuminate\Support\Facades\Bus; Bus::chain([ new ProcessPodcast, new OptimizePodcast, new ReleasePodcast, ])->dispatch(); App\Jobs\SendMail::withChain([ new IkinciBirIs, new UcuncuBirIs, ])->dispatch()
İlk Yorumu Siz Yapın