جدول المحتويات
تستخدم Queue ( طوابير الإنتظار )، في تنفيذ المهام التي تستغرق وقت طويل في التنفيذ، مثل رفع الفيديوهات، إرسال رسائل البريد الإلكتروني، حيث يمكن تأجيل المهام التي تستخدم موارد التطبيق، مما يؤدي لتحسين وقت الإستجابة والتحميل اللذان يعتبران من أساسيات نجاح أي موقع كما يؤثران أيضا على تحسين محركات البحث وتجربة المستخدم.
ولتوضيح أهميتها بشكل أكبر أنظر للصوره التالية
public function send(Request $request){ $email['name'] = $request->email_title; $email['email'] = $request->email; $email['subject'] = $request->subject; $email['message'] = $request->message; Mail::to("etharatest@gmail.com") ->send(new SendEail($email)); return redirect('/contact')->with('success','Mail Sent Successfully'); }
الصوره أعلاه هي صفحة إتصل بنا، حيث يتم إرسال الرسالة إلى البريد الإلكتروني، لكن ما نلاحظة أن الوقت المستغرق ما بين الضغط على زر إرسال، وظهور رسالة نجاح إرسال الرسالة هو ٦ ثواني، حيث لا يتم توجيه المستخدم للصفحة وإظهار رسالة نجاح الإرسال إلا بعد أن يتم إرسال البريد الإلكتروني، وليس من المنطق أن يبقى زائر التطبيق ينتظر هذه المده، وللتخلص من وقت الإنتظار تتيح لنا لارافيل إستخدام Queue.
توفر لنا لارافيل مجموعة من الخيارات لإستخدام طوابير الإنتظار مثل database, redis, sqs, beanstalkd...، حيث تم تعريفها مسبقا في الملف
app/config/queue.php
والخيار الإفتراضي هو sync
'default' => env('QUEUE_CONNECTION', 'sync'),
لكن ما سوف نستخدمة هنا هو خيار database لذلك يجب تحويل قيمة QUEUE_CONNECTION إلى database لكن التغيير لا يتم على الملف queue.php لكن التغيير يجب أن يتم في ملف .env
QUEUE_CONNECTION=database
إن إستخدام Queue لا يسرع من عملية إرسال البريد الإلكتروني في المثال أعلاه، لكن يسرع وقت الإستجابة وظهور رسالة تم إرسال الرسالة، حيث يقوم بعملية إرسال الرسالة بالخلفية، دون أن يشعر زائر الموقع بذلك من خلال إنشاء jobs.
إضافة جدول Queues
لإنشاء Queue بإستخدام أوامر Artisan
php artisan queue:table php artisan migrate
بعد تنفيذ الأمر سيتم إنشاء ملف migration سيتعامل مع جدول jobs، وذلك لأن جميع الـ queues سيتم تخزينها في جدول jobs.
public function up() { Schema::create('jobs', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('queue')->index(); $table->longText('payload'); $table->unsignedTinyInteger('attempts'); $table->unsignedInteger('reserved_at')->nullable(); $table->unsignedInteger('available_at'); $table->unsignedInteger('created_at'); }); }
في مقالة سابقة تم شرح كيف يمكن إرسال رسائل البريد الإلكتروني بإستخدام لارافيل، لكن كانت بدون إستخدام Queue ، وهنا سيتم إضافة Queue لإرسال الرسائل، وللقيام بذلك يجب إنشاء job للتعامل مع الرسائل المرسلة
php artisan make:job SendEmailJob
بعد تنفيذ الأمر سيتم إنشاء كلاس app/jobs/SendEmailJob
class SendEmailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct() { } public function handle() { } }
في الكونترولر بالدالة المسؤولة عن إرسال البريد الإلكتروني بدلا من إنشاء instance من mailable class سيتم عمل dispatch للـ SendEmailJob
public function send(Request $request){ $email['name'] = $request->email_title; $email['email'] = $request->email; $email['subject'] = $request->subject; $email['message'] = $request->message; SendEmailJob::dispatch($email); return redirect('/contact')->with('success','Mail Sent Successfully'); }
وفي ملف sendEmailJob نستقبل المتغيرات، ونقوم بعمل instance من Mailable Class
class SendEmailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $email; public function __construct($email) { $this->email=$email; } public function handle() { Mail::to("ethartest@gmail.com") ->send(new SendEail($this->email)); } }
الأن تبقى خطوة أخيرة حيث يجب إخبار لارافيل بإستخدام database driver في عملية queue، حيث إنها بالوضع الإفتراضي هي sync فلو ذهبنا للملف config/queue.php نجد إنها بالوضع الإفتراضي معرفة بـ sync
'default' => env('QUEUE_CONNECTION', 'sync'),
بالطبع يجب تعديلها في ملف .env وليس في ملف queue مباشرة
QUEUE_CONNECTION=database
الأن عند إرسال بريد إلكتروني ستظهر رسالة الإستجابه بشكل سريع للمستخدم، لكن يتم إرسال البريد الإلكتروني بالخلفية، حيث يتم تسجيل ذلك في قاعدة البيانات
لإستخدام Queue يجب أن نفهم النقاط التالية:-
php artisan queue:table
php artisan migrate
php artisan make:job SendEmailJob
SendEmailJob::dispatch($email);
QUEUE_CONNECTION=database
👏 👏 👏 👏 👏 👏 👏 👏 👏 👏 👏 👏
شكرا على المقالات الرائعة لو سمحت في شي قائمة بأهم الاشياء الضرورية في أي موقع لنعملها ضمن queue يعني افضل اذا بتساعدنا و نقدر نحصر هذي الامور بمقالة او تعليق بتسهل علينا العمل و شكرا لحضرتك
شرح مميز شكرا
عمل جميل
شكرا يا غالي
شغل عالي العال عاش نضال الشعب الفلسطيني
زائر
👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍