لطفا صبر کنید ...

ویژگی فوق العاده Laravel Queues

الهام غایب

توسط الهام غایب

دیدگاه ها: 0
بازدید ها : 172
رایگان
هدف ما این است که شما، در بالاترین سطح طراحی و توسعه وب باشید.

ثبت نام کنید

Laravel Queues برای ساده سازی وظایف چرخه‌ای در  اپلیکیشن به کار می‌رود و با انجام وظایف سخت به بهبود تجربه کاربری کمک می‌کند.


فرض کنید، شما کودکی دارید و می‌خواهید او را برای خرید به فروشگاه بفرستید، در همان حین، ممکن است پدرش از او بخواهد تا برایش آب بیاورد و عمویش درخواست یک خودکار  کند و وظایف احتمالی که ممکن است به او محول شود. کودک باید تمام این وظایف را انجام دهد. شما به عنوان پدر یا مادر کودک اگر به او اجازه دهید تمام آن کارها را در آنِ واحد انجام دهد احتمالا بعضی از آن‌ها را انجام نشده رها کرده و خسته می‌شود و در نهایت احساس بدی پیدا می‌کند. بهترین کاری که می‌توانید انجام دهید این است که کودک لیستی از آن کارها تهیه کند تا پس از انجام هر کدام از کارها به ترتیب اولویت، مقابل آن تیک بزند. این سناریو ایده ایجاد Laravel Queues است و برای مدیریت و انجام کارهای سنگین مانند پست گذاری در شبکه‌های اجتماعی، ارسال ایمیل، لاگین شدن در تعداد زیادی سایت و غیره به کار می‌رود.

استفاده از Laravel Queues

در این مقاله از لیداوب طی چند مرحله ساده با ایجاد یک دمو، به شما طرز استفاده از queues را در لاراول آموزش می‌دهیم. این دمو یک اپلیکیشن ساده ارسال ایمیل است که با کلیک روی یک دکمه به ارسال ایمیل می‌پردازد.

 ارسال ایمیل در لاراول

مقاله مرتبط:

پیش از آنکه به مبحث queues بپردازیم، می‌خواهیم به صورت نرمال ایمیل ارسال کرده و مدت زمان انجام آن را محاسبه کنیم و سپس این کار را با queues انجام داده و تفاوت زمانی را مقایسه کنیم. آنچه که در ابتدا نیاز داریم راه اندازی یک سرویس دهنده ایمیل است. ما از Mailtrap استفاده می‌کنیم که دارای پکیجی رایگان است و برای کار ما مناسب می‌باشد. یک حساب در آن ایجاد کنید تا یک اینباکس نمونه به نام Demo Inbox برای شما ایجاد شود. روی Demo Inbox کلیک کرده و نام کاربری و پسوردی که برای شما ایجاد شده است را در  فایل .env کپی کنید:

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[USERNAME]
MAIL_PASSWORD=[PASSWORD]
MAIL_ENCRYPTION=null
MAIL_FROM=[YOUR@EMAIL.COM]
MAIL_NAME=[YOUR-NAME]

با استفاده از دستور آرتیسان یک کنترلر ایجاد کنید تا اکشن‌های index و send را در آن قرار دهید:

php artisan make:controller HomeController

وقتی  کنترلر Home ایجاد شد، می‌توانیم اکشن index  را به آن اضافه کنیم که به جای صفحه اصلی عمل می‌کند:

 public function index()
    {
        return view()->make("home.index");
    }

همانطور که مشاهده می‌کنید، می‌خواهیم یک view که وجود ندارد را بازگردانی کنیم تا یک view به نام index.blade.php در resources/view/home ایجاد کنیم:

<div class="container">
    <div class="main">
        <a href="/send" class="btn btn-default">Send Email</a>
    </div>
</div>

ما فقط یک لینک با استایل بوت استرپ داریم که به /send اشاره دارد که باید آن را ایجاد کنیم. برای این اپلیکیشن به دو route به نام‌های / و /send نیاز داریم. بنابراین، هر چه در app/HTTP/routes.php وجود دارد را با کدهای زیر جایگزین می‌کنیم:

<?php
Route::get('/', 'HomeController@index');
Route::get('/send', 'HomeController@send');

تنها کاری که باید انجام دهیم ایجاد متد send برای ارسال ایمیل است. برای این کار به کدهای زیر نیاز داریم:

public function send()
    {
        Log::info("Request cycle without Queues started");
        Mail::send('email.welcome', ['data'=>'data'], function ($message) {

            $message->from('me@gmail.com', 'Christian Nwmaba');

            $message->to('chris@scotch.io');

        });
        Log::info("Request cycle without Queues finished");
    }

عبارت Log در ابتدا و انتها به ما کمک می‌کند بفهمیم درخواست چه زمانی کامل شده است. عبارت Mail دارای یک آرگومان است:

- محتوای ایمیل

- داده‌های پیوست شده به ایمیل

- یک Closure که به ما امکان تغییر سلیقه‌ای تنظیمات ایمیل را می‌دهد

شما باید وابستگی‌های زیر را در بالای کنترلر ایمپورت کنید:

use Log;
use Mail;

شاید از خودتان بپرسید چه نوع محتوایی به عنوان اولین آرگومان برای Mail اضافه می‌شود. Mail می‌تواند یک متن ساده یا یک view را بپذیرد و ما هم یک HTML view در resources/views/email/welcome.blade.php اضافه کردیم:

<h3>Welcome to Scotch Queue Team</h3>

<p>This is the most patient team in the Scotch community because we like to wait for our turn</p>

<p>This made our friends love us because we always give them time to do other simple tasks before
coming back to do ours</p>

در اینجا، می‌توانید دکمه Send در صفحه اصلی را فشار دهید. لوگوی خود را در storage/logs/laravel.log بررسی کرده تا متوجه تفاوت زمانی شوید.

ارسال ایمیل با Queues

حالا می‌خواهیم ببینیم ارسال ایمیل با queues چقدر آسان است. این کار دارای چند مرحله است:

مرحله اول: پیکربندی یک درایور

درایورها برای مدیریت queues و ذخیره موقت queues‌ها به کار می‌روند. می‌توانید درایور را به عنوان یک وظیفه در لیست بیل که در بالا گفته شد در نظر بگیرید. به دلیل اینکه queues‌های ما زیاد نیست فعلا از درایور database استفاده می‌کنیم اما شما اگر اپلیکیشن سنگین‌تری داشتید از Amazon ،Beanstalkd ،Redis  IronMQ و غیره استفاده کنید. می‌توانید لیستی از درایورها را در config/queue.php پیدا کنید. برای ایجاد درایور دیتابیس باید فقط دو دستور آرتیسان زیر را اجرا کنیم:

php artisan queue:table

php artisan migrate

باید به لاراول بگوییم که می‌خواهیم از database در فایل .env استفاده کنیم:

QUEUE_DRIVER=database

مرحله دوم: ایجاد یک وظیفه

ایجاد یک وظیفه نیاز به یک دستور artisan دیگر دارد:

php artisan make:job SendWelcomeEmail --queued

این دستور درست مانند make: controller یک چارچوب اولیه در app/jobs به نام SendWelcomeEmail ایجاد می‌کند. این فایل فقط یک متد handle() دارد و ما منطق ارسال ایمیل خود را پیاده سازی می‌کنیم.

مرحله سوم: متد handle()

همان منطقی که در اکشن کنترلر Home به کار بردیم به این متد منتقل شده و سپس Mailer را به شکل زیر به متد اضافه می‌کنیم:

public function handle(Mailer $mailer)
    {
        $mailer->send('email.welcome', ['data'=>'data'], function ($message) {

            $message->from('nwambachristian@gmail.com', 'Christian Nwmaba');

            $message->to('nwambachristian@gmail.com');

        });
    }

باید سرویس Mailer را ایمپورت کنید:

use Illuminate\Contracts\Mail\Mailer;

مرحله چهارم: انجام یا به تاخیر انداختن کار

حالا باید به HomeController خود بگوییم که آن کار باید اجرا شود اما به عنوان یک queue. متد send به این شکل کوتاه‌تر می‌شود:

public function send()
    {
         Log::info("Request Cycle with Queues Begins");
        $this->dispatch(new SendWelcomeEmail());
        Log::info("Request Cycle with Queues Ends");
    }

ما نمی‌توانیم متعلقات را به این کار وارد کنیم. اگر کاربری داشته باشیم که در دیتابیس ذخیره شده و ما به ایمیل او نیاز داشته باشیم، می‌توانیم این کار را انجام دهیم: $this->dispatch(new SendWelcomeEmail($user));

می‌توان انجام کار را به تعویق انداخته و به شکل زیر به آن زمان داد:

 public function send()
    {
        Log::info("Request Cycle with Queues Begins");
        $this->dispatch((new SendWelcomeEmail())->delay(60 * 5));
        Log::info("Request Cycle with Queues Ends");
    }

هنوز در حال ثبت زمان‌ها برای مقایسه مدت زمان انجام کار توسط این دو روش هستیم.

مرحله پنجم: بررسی Queues

آخرین کاری که باید انجام دهیم بررسی queues و ارسال ایمیل در زمان مناسب است:

php artisan queue:listen database

اگر شما از درایور دیگری به جز database استفاده می‌کنید، گزینه connection را جایگزین کنید. همچنین، می‌توانید database را حذف کرده و فقط php artisan queue:listen را اجرا کنید. این دستور آرتیسان در برابر queue پیش‌فرض که به فایل .env ارسال کرده‌اید اجرا می‌شود.

تفاوت زمانی

از کامپیوتری که در حال استفاده از آن هستیم، قبل از استفاده از queue، به طور متوسط ده و نیم ثانیه طول کشید تا وظیفه کامل شود:

[2016-02-23 13:43:37] local.INFO: Request cycle without Queues started 
[2016-02-23 13:43:50] local.INFO: Request cycle without Queues finished  

[2016-02-23 13:50:49] local.INFO: Request cycle without Queues started  
[2016-02-23 13:50:57] local.INFO: Request cycle without Queues finished

پس از استفاده از queue، تکمیل وظیفه چهار و سه دهم ثانیه طول کشید:

[2016-02-23 13:59:33] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 13:59:37] local.INFO: Request Cycle with Queues Ends  

[2016-02-23 14:03:26] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 14:03:32] local.INFO: Request Cycle with Queues Ends  

[2016-02-23 14:04:05] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 14:04:10] local.INFO: Request Cycle with Queues Ends

و با queue زمان دار، تنها یک ثانیه طول کشید:

[2016-02-23 14:32:26] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 14:32:27] local.INFO: Request Cycle with Queues Ends  

[2016-02-23 14:33:24] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 14:33:25] local.INFO: Request Cycle with Queues Ends  

[2016-02-23 14:34:04] local.INFO: Request Cycle with Queues Begins  
[2016-02-23 14:34:05] local.INFO: Request Cycle with Queues Ends

این اعداد زمانی مهم می‌شوند که شما بخواهید یک ایمیل را به هزار مشتری ارسال کنید.

مطالعه مقالات بیشتر در لیداوب:

می‌توانید از queue برای ارسال ایمیل، اشتراک گذاری در شبکه‌های اجتماعی، پست گذاری در شبکه‌های اجتماعی و غیره استفاده کنید. با این قابلیت می‌توانید تجربه کاربری مفیدی برای مشتریان خود ایجاد کنید. برای مطالعه مقالات بیشتر در زمینه طراحی سایت و لاراول مقاله‌های ما در کتابخانه آنلاین لیداوب را از دست ندهید.

5 از 2 رای

 مطالب مرتبط  

در قسمت زیر مطالبی وجود دارند که با مقاله فعلی مرتبط هستند



متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند

برترین مطالب

آموزش در لیداوب

از مقالات و ویدیو های آموزشی خودتان کسب درآمد کنید!

جدیدترین سرویس ما برای دوستان متخصص و خوش بیان در زمینه طراحی وب ارائه شد. این سرویس به شما این امکان را می دهد که به آسانی مقالات و یا ویدیو های آموزشی خود را در لیداوب منتشر کنید. فرصت مناسبی است که بدون داشتن وب سایت و یا وبلاگ و مهم تر از همه بدون هزینه، مطالب خود را در لیداوب منتشر کنید و مهم تر از همه با فروش آنها کسب درآمد کنید. همین حالا شروع کنید و این فرصت استثنایی را از دست ندهید.