آموزش صف بندی لاراول و استفاده از queue در هاست اشتراکی ارسال شده در ۰۷ آبان ۱۳۹۶

امروز میخوام یه پست آموزشی بزارم که مشکل خیلی ها هست

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

اگر سرور دارید این پست رو بخونید: آموزش صف بندی لاراول و استفاده از queue در سرورهای لینوکسی

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

پس اول عنوان ها رو براتون توضیح مختصر میدم تا متوجه بشین باید چه کاری انجام بدیم

عنوان اول کرون جاب هست

ببینید روی سرورهای مختلف یه سرویسی هست که مثل زمان سنج عمل میکنه یعنی مثلا میتونید بگید هر یک دقیقه یا یک ساعت یا حتی هر ماه یک کار مشخص رو انجام بده این سرویس توی سرور های لینوکسی به اسم کرون جاب (cron job) هست و سرورهای ویندوزی  Task Scheduler و نحوه کاربردشون هم تفاوت نداره از اونجایی که از نظر علما برای سرورها، سیستم عامل به جز لینوکس حرومه پس ادامه کار رو با کرون جاب پیش میریم ولی درعمل تفاوتی ندارن

 

عنوان دومی که باید توضیح بدم Scheduler لاراول هست

این بخش شاید مثل کرون جاب باشه و عملا همون شکلیه و زمان سنج لاراول هست ولی این بخش به تنهایی نمیتونه کار کنه و برای فعال شدن باید آدرسش به کرون جاب سرور داده بشه جلوتر عملی توضیح میدم

 

عنوان سوم ذخیره سازی صف هاست

ببینید شما مثلا میخواین ۱۰۰۰ ایمیل ارسال کنید اگر عادی ارسال کنید سرور نابود میشه و عملا ۹۹۰ تا ایمیل به دست کاربر نمیرسه برای حل این مشکل صف بندی میکنیم ارسال ها رو مثلا میگیم هر ۵ دقیقه ۱۰۰ تا ایمیل ارسال کن حالا برای اینکار باید کدی بنویسیم که ۱۰۰ ایمیل ارسال کنه و این کد رو ۱۰ بار بفرستیم تو صف و توی Scheduler بگیم هر ۵ دقیقه یک صف رو اجرا کن که صف ما اینجا همون کد ارسال ۱۰۰ ایمیل میشه

حالا این صف ها تو لاراول میتونن تو دیتابیس (mysql یا …) یا ردیس (نوعی دیتابیس nosql که رو رم ذخیره میشه) یا … ذخیره بشه که از طریق پوشه config و queue میتونید اینو مشخص کنید. برای شروع کار همون دیتابیس ذخیره کنید بعدا اگه خواستین تغییر بدین

روی database بزارین و کامند php artisan queue:table  و  php artisan queue:failed-table  رو بزنید تا مایگریشن جدول های مورد نیاز درست بشه و بعد هم که کامند مایگریشن بزنید تا جدول ها ساخته بشن اولی برای صف های در انتظار اجرا هست و دومی صف هایی که به هردلیلی اجرا نشدن

 

خوب بریم سراغ انجام کار

تو این مثال من میخوام هرکاربری ثبت نام کرد براش ایمیل بفرستم

تو کنترلر بعد از ثبت نام این کد رو میزنم:

;((Mail::to($user)->queue(new Mail($user, $data

 

فکر نکنم دیگه نیازی به توضیح این باشه این دستور ارسال یک ایمیل رو میفرسته تو صف اگر آشنایی ندارید بخش ارسال ایمیل لاراول رو بخونید.

حالا تو دیتابیس برید میبینید که یه رکورد جدید ثبت شده که مشخص میکنه یک صف در انتظار اجرا داریم

 

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

توی لوکال همونطور که میدونید با زدن کامند php artisan queue:work در ترمینال میتونید صف ها رو اجرا کنید و مشکلی ندارید

حالا مشکل اینجاست که ما رو سرور که نمیتونیم همش بریم این کامند رو بزنیم تا صف ها اجرا بشن یا اگه هاست اشتراکی داریم که اصلا دسترسی به ssh نداریم پس چیکار کنیم

اینجاست که اون عنوان ها بدردمون میخورن و باید از زمان سنج سرور یا کرون جاب و Scheduler استفاده کنیم

توی کرون جاب هاست اگه بریم همچین چیزی میبینیم:

این دایرکت ادمین هست ولی سی پنل هم تفاوتی نداره (من به خاطر اینکه سی پنل تحریممون کرده و رو سرورهای ایران نصب نمیشه ما هم تحریمش کردیم تا بفهمه همچین تحفه ای هم نیست والا دایرکت ادمین خیلی هم بهتره)

همینطور که میبینید بخشی هست به اسم کامند که باید دستوری که میخوایم سر تایم مشخص اجرا بشه رو میزنیم

و بالاتر دقیقه ساعت و… رو نوشته اگر ما همه رو ستاره بزاریم هر یک دقیقه این کامند ما اجرا میشه اگر دقیقه رو عدد بدیم بقیه رو ستاره هر ساعت یکبار و در دقیقه نوشته شده اجرا میشه اگر ساعت عدد بدیم و بقیه ستاره هر روز یکبار و سر ساعت نوشته شده و به همین ترتیب میتونید زمان سنج رو تنظیم کنید

ما میخوایم هر دقیقه یکبار کامند php artisan queue:work اجرا بشه تا صف ها اجرا بشن برای همین همه رو ستاره میزنیم و توی بخش کامند هم php artisan queue:work رو ولی اجرا نمیشه اینطور چرا؟

چون ما توی ترمینال میریم به آدرس پروژه و php artisan queue:work رو میزنیم که اجرا میشه و تو سرور که فقط هاست ما نیست و باید آدرس هاست خودمون رو بدیم

توی عکس قسمت پایین میبینید که نوشته چطور میتونید کامند بزارید و آدرس هاست ما رو هم نوشته :

/usr/local/bin/php /home/hosseiniza/domains/domain.com/public_html/script.php
/usr/local/bin/curl –silent http://www.domain.com/cron.php > /dev/null
/usr/bin/wget -O /dev/null http://www.domain.com/cron.php

 

خوب ما میخوایم یک دستور php ران کنیم پس مثال اولش بدردمون میخوره

اگه این مثال و مستندات لاراول بخش Scheduler رو نگاه کنیم متوجه میشیم که کامند ما باید اینشکلی بشه تا درست عمل کنه:

php /home/hosseiniza/domains/hosseinizadeh.ir/artisan queue:work >> /dev/null 2>&1

به همین راحتی اگه ما این کامند رو بزاریم تو کرون جاب و ادد کنیم این کامند هر یک دقیقه اجرا میشه ولی صبر کنید این کار مشکل داره و باعث میشه سرور بعد از چند دقیقه داون بشه و رم سرور رو نابود کنید چرا؟

چون هر دقیقه این کامند اجرا میشه بدون غیرفعال شدن یعنی اگه یک ساعت بگذره ۶۰ تا کامند درحال اجرا به این شکل دارید و خودتون و سرورتون رو نابود کردید با این کار

پس چیکار کنیم؟

اینجاست که Scheduler لاراول به دادمون میرسه

برای رفع مشکل باید توی کرون جاب این کامند رو بدیم هر یک دقیقه اجرا بشه:

php /home/hosseiniza/domains/hosseinizadeh.ir/artisan schedule:run >> /dev/null 2>&1

که میاد بخش زمان سنج لاراول رو نگاه میکنه اگر کاری باید انجام بشه انجام میده حالا ما باید کامند queue:work رو توی scheduler لاراول بزاریم تا اجرا بشه

برای اینکار به پوشه app و console و فایل kernel.php میریم و اینجا میتونیم کارهایی که باید با زمان سنج انجام بشه رو وارد میکنیم

شما اینجا داخل فانکشن scheduler هرچیزی میتونید تعریف کنید مثلا هر ماه یکبار پیام های بخش پشتیبانی که از زمانشون ۲ ماه گذشته رو پاک کن:

$schedule->call(function () {
$support = \App\Support::where('time','<',jDate::forge('now - 2 month')->time())->get(['id'])->toArray();
\App\Support::destroy($support);
})->monthlyOn(4, '02:30');

که آخرش من نوشتم monthly که هر ماه یکبار اجرا میشه و همینطوری هرکاری میخواین میتونید تعریف کنید (مستندات رو بخونید)

و همچنین میتونیم queue:work رو هم اینجا تعریف کنیم به این شکل:

$schedule->command('queue:work --daemon')->withoutOverlapping();

$schedule->command('queue:work --daemon')->everyMinute()->withoutOverlapping();

این دوتا کد هیچ تفاوتی ندارن چون تو کرون جاب ما گفتیم هر دقیقه scheduler لاراول اجرا بشه و کارهایی که زمان اجراشون رسیده رو ران کنه پس نوشتن یا ننوشتن هر دقیقه تو کرنل تفاوتی نداره برای این کد ولی اگر میخواستیم هر ۲ دقیقه یا بیشتر اجرا بشه باید بنویسیم تو کرنل هر ۲ دقیقه یا زمان های دیگه

خوب آخر کامند میبینید که نوشتم withoutOverlapping که این میاد همون مشکل داون شدن سرور رو حل میکنه یعنی اگه این کامند درحال اجرا نبود اجراش میکنه که باعث میشه همیشه فقط یکبار queue:work داشته باشیم

 

یه نکته رو یادم رفت اضافه کنم اگر میخواستین نتیجه اجرای کرون جاب رو تست کنید میتونید تو هاست که دارین تعریف میکنید یک ایمیل بدین و تعریف کنید که بعد از هربار اجرا یک ایمیل براتون بفرسته و نتیجه رو بگه برای اینکار اون   /dev/null 2>&1 رو بعد از کامند حذف کنید اینکار انجام میشه یعنی کامند کرون جاب رو به شکل زیر قرار بدین

php /home/hosseiniza/domains/hosseinizadeh.ir/artisan schedule:run

ولی بعد از اینکه تست درست بود دوباره غیرفعال کنید ارسال ایمیل رو وگرنه هر دقیقه یک ایمیل براتون میاد و ممکنه برای سرور مشکل درست بشه

بهترین روش برای تسته و هر دقیقه نتیجه اجرای کرون جاب رو براتون ایمیل میکنه و اگه مشکلی باشه میگه و اگه مشکلی نباشه هم ایمیلی با متن زیر دریافت می کنید:

Running scheduled command: ‘/usr/local/bin/php’ ‘artisan’ queue:work –daemon > ‘/dev/null’ 2>&1

 

مشکلات احتمالی:

اگر سرور رو خودتون کانفیگ کردید احتمالا فانکشن های خطرناک رو بستید و اگر proc_open رو بسته باشید کرون جاب اجرا نمیشه پس باید بازش کنید که این مشکل رو بهتون ایمیل میکنه تو نتیجه اجرای کرون جاب اگه نگفت پس فانکشنش غیرفعال نشده

 

اگر دسترسی به ssh دارید میتونید کامندی که تو کرون جاب گذاشتین رو تو ssh وارد کنید و نتیجه رو همونجا ببینید اگه مشکل نداشت تو کرون جاب بزارینش (مشکلات اشتباه نوشتن آدرس رو اینطوری میشه پیدا کرد)

 

اگر روی سرورتون فایروال csf یا هرفایروال دیگه ای نصب کردید باید دسترسی اجرای کامند رو به php بدین

برای اینکار تو آدرس /etc/csf/csf.pignore آخرش exe:/usr/local/bin/php رو بزارید و اگه همزمان از php7 هم استفاده میکنید exe:/usr/local/php71/bin/php-cgi71 رو هم باید بزارید و فایروال رو ریست کنید تا مشکل حل بشه

 

اگر ایمیل رو فعال کردید که نتیجه کرون براتون بفرسته ممکنه با همچین اروری مواجه بشین:

storage/framework/cache/data/27/c1/27c1b23010afdda7ef6fe10d6d10955da1a96e64): failed to open s tream: Permission denied

که برای رفع این مشکل کافیه کش رو پاک کنید توی پوشه storage/framework/cache/data/ برید و هرچی هست پاک کنید یا اینکه توی ترمینال یا ssh کامند زیر رو بزنید:

php artisan cache:clear

 

امیدوارم مفید بوده باشه

موفق و سربلند باشید

برچسب ها: , , ,
نظرات 53 نظر

53 پاسخ به “آموزش صف بندی لاراول و استفاده از queue در هاست اشتراکی”

  1. الیاس گفت:

    ممنون از مطلب کاربردیتون

  2. هدا گفت:

    با عرض سلام و احترام ممنون از وقتی که گذاشتید برای این آموزش، بسیار مفید بود

  3. امیر گفت:

    ممنون عالی بود

  4. محمد گفت:

    واقعا دمت گرم ، مطلب و نحوه توضیح دادنش خرف نداشت

  5. کیوان گفت:

    با سلام و عرض ادب خدمت شما
    خیلی از مطلبتون خوشحال شدم

    منتها یکی از دوستانمون که همین مشکل رو داشتن گفتن این روش شماروهم زدن منتها با مشکلات جدیدی روبرو شدن. ممنون میشم بفرمایید که حرف ایشونو به عنوان یه مشکل جدید تایید میکنید یا خیر؟ و اگه تایید میکنید راه حلی دارید؟ متشکر
    اینطور گفتن :

    منم این روش رو زده بودم
    دو تا جا به بن بست خوردم

    ۱٫
    اگه کش لاراول رو پاک کنی اون
    withoutOverLapping
    دیگه جواب نمیده و دوباره اجرا میشه
    پس باید کش ها رو خیلی با دقت پاک کنی

    ۲٫
    هاست ها معمولا هر چند وقت یک بار یه قطعی یه خیلی ریز دارن
    همون باعث میشد
    queue:work
    از کار بیفته که خب مشکلی نبود
    اما مشکل اینجا بود که فایل های مربوط به
    withoutOverlapping
    سرجاشون میموندن و دستور اجرا نمیشد و مجبور بودم خودم دستی اجرا کنم

    و اینگونه بود که من به این نتیجه رسیدم
    queue
    لاراول ساخته شده واسه اینکه با
    supervisor
    هماهنگ باشه نه هاست اشتراکی

    • علیرضا حسینی زاده گفت:

      سلام خواهش میکنم
      خیر این مشکلات بوجود نمیاد حدود ۱ ساله روی چند هاست و سرور و سایت مختلف از همین روش استفاده کردم و هیچ یک از این مشکلات بوجود نیومده
      موفق باشید

  6. mahsa گفت:

    سلام . ممنون بابت مطلب خوبتون.
    درصورتی که بخوایم چندین ایمیل ارسال کنیم برای هر ایمیل یک job تعریف میکنیم یا یک جاب مینویسیم برای ارسال همه ایمیل ها؟

    • علیرضا حسینی زاده گفت:

      سلام
      برای هر دسته ایمیل یک صف
      مثلا هر ۱۰۰ یا ۲۰۰ ایمیل
      که هر بار که جاب اجرا بشه و صف های داخلش بخوان اجرا بشن ۱۰۰ ایمیل ارسال بشه

  7. سامان گفت:

    سلام و خسته نباشید و ممنون بابت مطالبی خوبی که مینویسید . من با لاراول کار میکنم و دسترسی به سرور را هم در محیط سی پنل دارم . در لاراول دو تا فایل هست که به کران جاب مربوط میشه یکی فایل kernel.php ودیگری فایلی به اسم دلخواه مثلا cron.php که حاوی کاری است که میخواهیم بطور متناوب اجرا شود . در محیط سی پنل یک آیتمی داره به اسم cronJob که در ان میتوانیم دوره تناوب اجرای دستور و محل فایل cron.php را مشخص کنیم . آخرش کاری که توانستم بکنم این بود که کران جاب رو فعال کنم ولی نمیتونه فایل cron.php را درست اجرا کنه و میگه Class ‘Illuminate\Console\Command’ not found . این پیام در ایمیلی که بهم میده هستش . چند تا سوال برام پیش اومد اول اینکه چه نیازی به این فایل kernel.php هست ؟ ما در خط command اسمی از آن نمیبریم . دوم اینکه اگر اصلا میشه دستورات آرتیسان را در خود cpanel که رابط من با سرور هست اجرا کنم ؟ در اینصورت چه دستوری باید بدم که پیام خطای بالا را نده ؟ سوم اینکه در خط کامند اصولا دو مدل میشه نوشت یکی آدرس فایل cron.php را داد و دیگری دستور آرتیسان artisan schedule:run را داد . چه فرقی دارن اینا با هم .
    خیلی متشکر

    • علیرضا حسینی زاده گفت:

      سلام
      درست متوجه نشدم ولی اون کلاسی که پیدا نمیکنه مشکلش نیم اسپیسه که باید قرار بدید.
      در دستورات آرتیسان هم خطای بالا رو میده چون مشکل نیم اسپیس هست نه کرون جاب
      اگر داخل فایل cron.php دستور آرتیسان رو قرار بدید تفاوتی نمیکنه هرطور راحت تر بودید انجام بدید
      موفق باشید

  8. سامان گفت:

    سلام و متشکر از پاسخ شما . من با دستور آرتیسان فایل cron.php را ساختم و خودش namespace را مشخص کرده بود namespace App\Console\Commands; این دستور درسته ؟ هر مثالی که در شبکه دیدم همین نیم اسپیس را داشت . کجا دارم اشتباه میکنم ؟ حتی یکبار لاراول را عوض کردم و آنرا ارتقا دادم بازم درست نشد . ممنون از لطفتون .

    • علیرضا حسینی زاده گفت:

      شما میگید به این ارور میگیره: Class ‘Illuminate\Console\Command’ not found
      باید بگردید مشکل رو پیدا کنید من نمیتونم از اینجا باگ رو پیدا کنم

  9. سامان گفت:

    سلام و احترام . بطور خلاصه من کارهای زیر ر انجام داده ام
    ۱- بکمک دستور artisan:console یک فایل ساختم که نتیجه اش ایجاد یک فایل با نام mycron.php در مسیر app/console/commands گشت
    ۲- در این فایل عبارت namespace App\Console\Commands; وجود داره
    ۳- در این فایل عبارت use Illuminate\Console\Command; هم وجود داره
    ۳- در این فایل کلاس mycron , اکستنت شده به کلاس command
    ۴-در محیط سی پانل در بخش cronjob , عبارتی را که وارد میکنم نتیجه اش این میشه که سرور بصورت پریودیک برای من ایمیل میفرسته که در آن میگه نمیتونه در فایل cron , کلاس ‘Illuminate\Console\Command’ را در فایل mycron.php پیدا کنه .
    نمیدنم چرا این خطا را میده . لطف میکنید راهنمائی کنید . تشکر از شما

    • علیرضا حسینی زاده گفت:

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

  10. علی گفت:

    علیرضا جان من این دستور رو در کرنل نوشتم خط اول اجرا میشه و در فایل لاگ اون لاگی که نوشتم ثبت میشه ولی دستور دوم اجرا نمیشه

    Log::info(‘START EXECUTE CRON JOB’);
    // $schedule->command(‘queue:work –daemon’)->everyMinute()->withoutOverlapping();

    $schedule->command(‘queue:work –daemon’)
    ->appendOutputTo(storage_path() . ‘/logs/queue.log’)
    ->everyMinute()
    ->withoutOverlapping();

  11. سامان گفت:

    سلام آقای حسینی زاده و خسته نباشید . یه موردی بود خواستم اگر امکانش هست راهنمائی کنید . من میخوام در برنامه ام که با لاراول ۵٫۲ نوشتم ایمیل ارسال کنم . در ارسال ایمیل مشکلی ندارم ولی وقتی محتوی ایمیل رو با جی کوئری میخوام مشخص کنم در ایمیل ارسالی محتوی چاپ نمیشه . در حالی که وقتی در فایل مربوط به mail در view محتوی را بصورت دستی , معمولی مینویسم محتوی را در ایمیل ارسالی خواهم داشت . متن فایل mail ام اینجوریه :

    $(“#container”).text(“hello”);
    $(document).ready(function(){
    $(“p”).text(“Hello world!”);
    });

    Name: saman
    Email address:
    Message: hello world

    ممنون میشم اگر در این زمینه راهنمائی کنید . البته همین فایل رو که در کامپیوتر با پسوند html اجرا کنم درست اجرا میشه ولی وقتی روی هاست میره و برای ایمیل بخواد استفاده شه مشکل درست میشه و محتوی ارسال نمیشه . من انتظار داشتم که کلمه hello رو در ایمیلم در div container داشته باشم که اینجور نیست . ممنون از لطف شما .

  12. حامد گفت:

    دوست عزیز گفتید که کرون جاب روی هر بار یک دقیقه ست میکنیم پس این تایم اخر این فانکشن چی میگه؟
    $schedule->call(function () {
    $support = \App\Support::where(‘time’,’time())->get([‘id’])->toArray();
    \App\Support::destroy($support);
    })->monthlyOn(4, ’02:30′);

    ممنون میشم راهنمایی کنید

    • علیرضا حسینی زاده گفت:

      تایم آخر مشخص میکنه که در چه فاصله زمانی اون دستور اجرا بشه
      اون هر یک دقیقه را باید توی کرون جاب تعریف کنید به صورت ثابت

  13. علی گفت:

    سلام خیلی ممنون از مطلب کاربردی و اموزش خوبت خیلی به دردم خورد . خدا خیرت بده.من این کار رو کردم فقط به یه خطا میخورم. ببینین این الان دقیق طبق آموزش داره کار میکنه برای من ولی هر چند ساعت یبار این خطا یرای من ایمیل میشه :

    Processing: App\Jobs\User\SendFirstSMSForCouponToUserJob
    Symfony\Component\Debug\Exception\FatalErrorException : Maximum execution time of 30 seconds exceeded

    خطا رو اصلا نمیفهمم ولی روشی که من برای حلش پیدا کردم موقتا و خیلی ابتدایی هست میرم توی کران جاب به جای schedule:run تا اخر مینویسم queur:work و یک دیقه صبر میکنم دوباره همون عبارت قبلی رو مینویسم درست میشه .
    نمیدونم واقعا خطاش چیه. الان درست میشه اس ام اس ارسال میشه و خیلی خوب کار میکنه ولی چند ساغت بعد دوباره این خطا رو میده. جاب ها توی دیتابیس میخورن ولی ارسال نمیشن. باید حتما بیام به روشی که گفتم اجرا کنم تا ارسال بشن بعد دوباره برگردونم. ممنون میشم کمکم کنید

  14. علی گفت:

    سلام خیلی ممنون از مطلب کاربردی و اموزش خوبت خیلی به دردم خورد . خدا خیرت بده.من این کار رو کردم فقط به یه خطا میخورم. ببینین این الان دقیق طبق آموزش داره کار میکنه برای من ولی هر چند ساعت یبار این خطا یرای من ایمیل میشه :

    Processing: App\Jobs\User\SendFirstSMSForCouponToUserJob
    Symfony\Component\Debug\Exception\FatalErrorException : Maximum execution time of 30 seconds exceeded

    خطا رو اصلا نمیفهمم ولی روشی که من برای حلش پیدا کردم موقتا و خیلی ابتدایی هست میرم توی کران جاب به جای schedule:run تا اخر مینویسم queur:work و یک دیقه صبر میکنم دوباره همون عبارت قبلی رو مینویسم درست میشه .
    نمیدونم واقعا خطاش چیه. الان درست میشه اس ام اس ارسال میشه و خیلی خوب کار میکنه ولی چند ساغت بعد دوباره این خطا رو میده. جاب ها توی دیتابیس میخورن ولی ارسال نمیشن. باید حتما بیام به روشی که گفتم اجرا کنم تا ارسال بشن بعد دوباره برگردونم. ممنون میشم کمکم کنید

  15. علی گفت:

    سلام. وقتتون بخیر
    اگه من بخوام ی سری محصول از دیتابیس بگیرم و اونا رو به ی کنترلر بفرستم که در صفحه اصلی اجرا میشه. چیکار باید بکنم؟
    دقیق تر بخوام بگم نمونش توی قسمت پیشنهاد شگفت انگیز دیجی کالا هست که ساعت ۱۲ شب ریست میشه. من محصولات رو از دیتابیس گرفتم. چجوری باید بفرستمش به کنترلر مربوطه که کار کنه؟
    ممنون میشم راهنمایی کنید

    • علیرضا حسینی زاده گفت:

      سلام
      شما داری راه رو اشتباه میری نیازی نیست از صف بندی استفاده کنی برای اینکار
      کافیه یک جدول درست کنی و بگی بین زمان فلان تا فلان چه محصولاتی نشون داده بشه
      و توی صفحه اصلی وقتی رکوئست زده بشه نسبت به زمانی فعلی کوئری میزنه دیتابیس اگر محصولی باشه برمیگردونه و شما میتونید نشونشون بدید

  16. sara گفت:

    با سلام و وقت بخیر
    من داخل پروژم دوتا job دارم که برای اجراشون باید دستور php artisan queue:work رو میزدم دیگه.
    من کاملا بر اساس این آموزش پیش رفتم، داخل لوکال هم تست کردم و درست بود. ولی روی هاست وقتی کرون جاب رو فعال میکنم این ارور رو بهم ایمیل میکنه
    #!/usr/bin/env php
    No scheduled commands are ready to run. لطفا راهنمایی کنید چند روزه منو درگیر کرده خیلی ممنونم.

  17. بهنام گفت:

    مهندس دمت گرم.یطوری واضح توضیح دادی که حض کردم.عالی
    ۱۰ جا خوندم متوجه نمیشدم

  18. الیاس گفت:

    @sara
    مشکل استفاده از تابع withoutOverlapping هست زمانیکه این متد برای اولین بار اجرا شود. در فولدر storage/framework/cach/data فایل کشی ایجاد میشود که وجود این فایل مانع از اجرای مجدد میشود. حتی اگر برای اولین بار هم اجرا نشد شما لازم است یک بار دستور php artisan cache:clear را اجرا کنید تا کش ها خالی بشود.

  19. الیاس گفت:

    @sara
    لازم است که عددی به منزله دقیقه به عنوان آرگومان این متد داده شود. مثلا:
    withoutOverlapping(2) واین به این معنی است که هر ۲ دقیقه قفل نرم افزاری زمانبند لاراول باز میشود تا زمانبند بعدی بتواند پس از آن شروع به کار کند.
    اگر ورودی به این تابع ندهید به صورت پیشفرض هر ۲۴ ساعت یک بار زمانبند قابل اجرا است. تازه آن هم به این صورت که حتی اگر بیش از یک زمانبند تعریف کرده باشید به محض اجرای زمانبند اول قفل نرم افزاری فعال شده و سایر زمانبندهای بعدی کار نمیکنند.
    به همین دلیل پیش نهاد می کنم که این متد را در آخرین زمانبند خود استفاده کنید.
    منظورم از زمانبند هم کد زیر است که درفایل kernel.php واقع در شاخه app/console و در متد schedule آن نوشته میشود:
    $schedule->command(‘queue:work –daemon’)->withoutOverlapping(2);

  20. mr smart گفت:

    مرسی عالی بود هم جامع و هم کامل

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

  21. mr black گفت:

    داداش پایین سایتت نوشته تو فوتر :

    بدون افتخار، نیرو گرفته از وردپرس فارسی

    :))))))))))

  22. مهدی رضوی گفت:

    سلام واقعا ممنون
    صدجا این صف و جاب رو خونده بودم آخر نفهمیدم چیه اما با توضیح شما کاملا فهمیدم
    فقط یه چیزی چه جوری میشه هر صد ایمیل رو در یک صف تعریف کرد؟
    میشه نمونه کدش رو بنویسید؟
    ممنون

    • علیرضا حسینی زاده گفت:

      سلام نمونه ندارم الان
      ولی شما میتونید داخل کد تا ۱۰۰ بشمارید و بعد یک delay برای صف های بعدی بزنید و دوباره تا ۱۰۰ بشماریید به همین شکل تا آخر

  23. محمدرضا هرندی گفت:

    سلام می تونی دستور Artisan رو از خود laravel اجرا کنی خودش تو library هاش این امکانو بهت میده
    Artisan\ اسم libraryشه..

  24. کیوان گفت:

    با سلام و ممنون از مقاله بینظیرتون
    آیا نباید دستور queue:restart هم لحاظ بشه؟؟

    کلا این دستور برای چی هست؟ شنیدم لازمه اجرا بشه درسته؟

  25. کیوان گفت:

    ادمین عزیز من این روش رو انجام دادم اما تا وقتی کران در حال اجراست Number Of Processes های سرورم ۷۷ درصد پر میشه
    چرا؟
    ممنون میشم راهنمایی کنید

  26. محمد گفت:

    ممنون که وقت گذاشتی و با این جزییات بیان کردی

  27. مهدی گفت:

    ۰

    سلام من یه مشکلی خوردم و نمیدونم باید چجوری حلش کنم
    توی kernel من یکسری دستورات گذاشتم که مثلا هر ده دقیقه یه کاری بکنه هر بیست دقیقه یک کار دیگه بکنه و از طرفی یکسری job هم دارم که مثلا میخوام بگم job های default من رو هر بیست دقیقه یک بار اجرا کن و خب این کد رو هم توی kernel قرار میدم

    $schedule->command(‘queue:work’)->everyFourMinutes();

    ولی به محض اجرای این کد تمام job های default من اجرا میشه و دیگه هیچ کدوم از دستورات من که توی kernel نوشتم اجرا نمیشه مشکل از کجاست ضمن این که من توی local و داخل ویندوز دارم این کار رو انجام میدم لطفا راهنماییم کنید بدجوری گیج شدم ممنون

    • علیرضا حسینی زاده گفت:

      سلام مهدی جان
      احتمالا جاب هات رو که ادد میکنی به صف براشون زمان دیلی نمیزاری و میگی همون لحظه اجرا بشه برای همین وقتی کیوورک ران میکنی همون لحظه همشون ارسال میشن
      اگر تو دیتابیس داری جاب هات رو ادد میکنی تو دیتابیس برو و زمان اجرا شدن جاب هات رو نگاه کن
      برای اینکه دیلی بدی به جاب هات موقع ایجادشون باید مقدار delay رو بهش بدی مثلا ۱۰ دقیقه بعد یا ۱ ساعت بعد یا هرچی
      مستندات زیر رو بخون
      https://laravel.com/docs/8.x/queues#delayed-dispatching
      موفق باشی

  28. مهدی گفت:

    سلام
    ممنون بابت مطالب به اشتراک گذاشته شده
    یه سوالی داشتم در مورد ارسال ایمیل یا اس ام اس
    من اگر بخام به هزار یا چند هزار نفر ایمیل یا اس ام اس بفرستم همه اونها رو در کیو گذاشتم حالا چجور باید بگم که هر دقیقه ۲۰ تا از جدول جاب رو اجرا کنم، چجور بگم؟
    همون کدهایی که شما در کرون جاب و اسکوجییل گفته بودید گذاشتم فقط نمیدونم چجور بگم هر دقیقه ۲۰ تا از جاب ها رو اجرا کن

  29. حسین بهرامی گفت:

    دمت گرم خیلی حال کردم ، کامل و ساده توضیح داده بودی

  30. آرمان دامغانپور گفت:

    عالی بود تشکر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *