لارافيل, Others / 2024-09-16

Laravel Queues قوائم الإنتظار في لارافيل خطوة بخطوة

Laravel Queues قوائم الإنتظار في لارافيل خطوة بخطوة

2024-09-16 وقت القراءه : 4 دقائق

جدول المحتويات

ما هي قوائم الإنتظار في لارافيل Laravel Queue؟

تستخدم 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.


ما هي الخيارات التي توفرها لارافيل لإستخدام طوابير الإنتظار Queue Drivers؟

توفر لنا لارافيل مجموعة من الخيارات لإستخدام طوابير الإنتظار مثل 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 في لارافيل؟

إن إستخدام 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 ، وهنا سيتم إضافة 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 يجب أن نفهم النقاط التالية:-

  • إنشاء جدول Queue.
php artisan queue:table
php artisan migrate
  • إنشاء jobs .
php artisan make:job SendEmailJob
  • عمل disbatch للمهمة.
SendEmailJob::dispatch($email);
  • تحديد driver الإفتراضي في ملف .env
QUEUE_CONNECTION=database

التعليقات
زائر
منذ 3 سنوات

👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍

زائر
منذ 3 سنوات

👏 👏 👏 👏 👏 👏 👏 👏 👏 👏 👏 👏

Muhanad
منذ 3 سنوات

شكرا على المقالات الرائعة لو سمحت في شي قائمة بأهم الاشياء الضرورية في أي موقع لنعملها ضمن queue يعني افضل اذا بتساعدنا و نقدر نحصر هذي الامور بمقالة او تعليق بتسهل علينا العمل و شكرا لحضرتك

زائر
منذ سنتين

شرح مميز شكرا

Ammar
منذ سنتين

عمل جميل

زائر
منذ سنتين

شكرا يا غالي

tohami
منذ سنة

شغل عالي العال عاش نضال الشعب الفلسطيني

إضافة تعليق
Loading...