علیرضا حسینی زاده
یه برنامه نویس
مدیر فنی افرافایل
درباره من
آموزش صف بندی لاراول و استفاده از 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
امیدوارم مفید بوده باشه
موفق و سربلند باشید
ممنون از مطلب کاربردیتون
خواهش میکنم داداش
موفق باشی
با عرض سلام و احترام ممنون از وقتی که گذاشتید برای این آموزش، بسیار مفید بود
خواهش میکنم هدا جان
موفق باشی
ممنون عالی بود
خواهش میکنم امیر جان
واقعا دمت گرم ، مطلب و نحوه توضیح دادنش خرف نداشت
خواهش میکنم محمد جان
با سلام و عرض ادب خدمت شما
خیلی از مطلبتون خوشحال شدم
منتها یکی از دوستانمون که همین مشکل رو داشتن گفتن این روش شماروهم زدن منتها با مشکلات جدیدی روبرو شدن. ممنون میشم بفرمایید که حرف ایشونو به عنوان یه مشکل جدید تایید میکنید یا خیر؟ و اگه تایید میکنید راه حلی دارید؟ متشکر
اینطور گفتن :
منم این روش رو زده بودم
دو تا جا به بن بست خوردم
۱٫
اگه کش لاراول رو پاک کنی اون
withoutOverLapping
دیگه جواب نمیده و دوباره اجرا میشه
پس باید کش ها رو خیلی با دقت پاک کنی
۲٫
هاست ها معمولا هر چند وقت یک بار یه قطعی یه خیلی ریز دارن
همون باعث میشد
queue:work
از کار بیفته که خب مشکلی نبود
اما مشکل اینجا بود که فایل های مربوط به
withoutOverlapping
سرجاشون میموندن و دستور اجرا نمیشد و مجبور بودم خودم دستی اجرا کنم
و اینگونه بود که من به این نتیجه رسیدم
queue
لاراول ساخته شده واسه اینکه با
supervisor
هماهنگ باشه نه هاست اشتراکی
سلام خواهش میکنم
خیر این مشکلات بوجود نمیاد حدود ۱ ساله روی چند هاست و سرور و سایت مختلف از همین روش استفاده کردم و هیچ یک از این مشکلات بوجود نیومده
موفق باشید
سلام . ممنون بابت مطلب خوبتون.
درصورتی که بخوایم چندین ایمیل ارسال کنیم برای هر ایمیل یک job تعریف میکنیم یا یک جاب مینویسیم برای ارسال همه ایمیل ها؟
سلام
برای هر دسته ایمیل یک صف
مثلا هر ۱۰۰ یا ۲۰۰ ایمیل
که هر بار که جاب اجرا بشه و صف های داخلش بخوان اجرا بشن ۱۰۰ ایمیل ارسال بشه
سلام و خسته نباشید و ممنون بابت مطالبی خوبی که مینویسید . من با لاراول کار میکنم و دسترسی به سرور را هم در محیط سی پنل دارم . در لاراول دو تا فایل هست که به کران جاب مربوط میشه یکی فایل 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 دستور آرتیسان رو قرار بدید تفاوتی نمیکنه هرطور راحت تر بودید انجام بدید
موفق باشید
سلام و متشکر از پاسخ شما . من با دستور آرتیسان فایل cron.php را ساختم و خودش namespace را مشخص کرده بود namespace App\Console\Commands; این دستور درسته ؟ هر مثالی که در شبکه دیدم همین نیم اسپیس را داشت . کجا دارم اشتباه میکنم ؟ حتی یکبار لاراول را عوض کردم و آنرا ارتقا دادم بازم درست نشد . ممنون از لطفتون .
شما میگید به این ارور میگیره: Class ‘Illuminate\Console\Command’ not found
باید بگردید مشکل رو پیدا کنید من نمیتونم از اینجا باگ رو پیدا کنم
سلام و احترام . بطور خلاصه من کارهای زیر ر انجام داده ام
۱- بکمک دستور artisan:console یک فایل ساختم که نتیجه اش ایجاد یک فایل با نام mycron.php در مسیر app/console/commands گشت
۲- در این فایل عبارت namespace App\Console\Commands; وجود داره
۳- در این فایل عبارت use Illuminate\Console\Command; هم وجود داره
۳- در این فایل کلاس mycron , اکستنت شده به کلاس command
۴-در محیط سی پانل در بخش cronjob , عبارتی را که وارد میکنم نتیجه اش این میشه که سرور بصورت پریودیک برای من ایمیل میفرسته که در آن میگه نمیتونه در فایل cron , کلاس ‘Illuminate\Console\Command’ را در فایل mycron.php پیدا کنه .
نمیدنم چرا این خطا را میده . لطف میکنید راهنمائی کنید . تشکر از شما
سلام از راه دور نمیتونم راهنمایی کنم
باید دیباگ کنید ببینید مشکل کجاست
موفق باشید
علیرضا جان من این دستور رو در کرنل نوشتم خط اول اجرا میشه و در فایل لاگ اون لاگی که نوشتم ثبت میشه ولی دستور دوم اجرا نمیشه
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();
باید فایل لاگ لاراول رو چک کنید ببینید ارورش چیه
سلام آقای حسینی زاده و خسته نباشید . یه موردی بود خواستم اگر امکانش هست راهنمائی کنید . من میخوام در برنامه ام که با لاراول ۵٫۲ نوشتم ایمیل ارسال کنم . در ارسال ایمیل مشکلی ندارم ولی وقتی محتوی ایمیل رو با جی کوئری میخوام مشخص کنم در ایمیل ارسالی محتوی چاپ نمیشه . در حالی که وقتی در فایل مربوط به mail در view محتوی را بصورت دستی , معمولی مینویسم محتوی را در ایمیل ارسالی خواهم داشت . متن فایل mail ام اینجوریه :
$(“#container”).text(“hello”);
$(document).ready(function(){
$(“p”).text(“Hello world!”);
});
Name: saman
Email address:
Message: hello world
ممنون میشم اگر در این زمینه راهنمائی کنید . البته همین فایل رو که در کامپیوتر با پسوند html اجرا کنم درست اجرا میشه ولی وقتی روی هاست میره و برای ایمیل بخواد استفاده شه مشکل درست میشه و محتوی ارسال نمیشه . من انتظار داشتم که کلمه hello رو در ایمیلم در div container داشته باشم که اینجور نیست . ممنون از لطف شما .
سلام اینطوری نمیشه متوجه شد مشکل از کجاست. خودتون باید دیباگ کنید.
دوست عزیز گفتید که کرون جاب روی هر بار یک دقیقه ست میکنیم پس این تایم اخر این فانکشن چی میگه؟
$schedule->call(function () {
$support = \App\Support::where(‘time’,’time())->get([‘id’])->toArray();
\App\Support::destroy($support);
})->monthlyOn(4, ’02:30′);
ممنون میشم راهنمایی کنید
تایم آخر مشخص میکنه که در چه فاصله زمانی اون دستور اجرا بشه
اون هر یک دقیقه را باید توی کرون جاب تعریف کنید به صورت ثابت
سلام خیلی ممنون از مطلب کاربردی و اموزش خوبت خیلی به دردم خورد . خدا خیرت بده.من این کار رو کردم فقط به یه خطا میخورم. ببینین این الان دقیق طبق آموزش داره کار میکنه برای من ولی هر چند ساعت یبار این خطا یرای من ایمیل میشه :
Processing: App\Jobs\User\SendFirstSMSForCouponToUserJob
Symfony\Component\Debug\Exception\FatalErrorException : Maximum execution time of 30 seconds exceeded
خطا رو اصلا نمیفهمم ولی روشی که من برای حلش پیدا کردم موقتا و خیلی ابتدایی هست میرم توی کران جاب به جای schedule:run تا اخر مینویسم queur:work و یک دیقه صبر میکنم دوباره همون عبارت قبلی رو مینویسم درست میشه .
نمیدونم واقعا خطاش چیه. الان درست میشه اس ام اس ارسال میشه و خیلی خوب کار میکنه ولی چند ساغت بعد دوباره این خطا رو میده. جاب ها توی دیتابیس میخورن ولی ارسال نمیشن. باید حتما بیام به روشی که گفتم اجرا کنم تا ارسال بشن بعد دوباره برگردونم. ممنون میشم کمکم کنید
سلام خیلی ممنون از مطلب کاربردی و اموزش خوبت خیلی به دردم خورد . خدا خیرت بده.من این کار رو کردم فقط به یه خطا میخورم. ببینین این الان دقیق طبق آموزش داره کار میکنه برای من ولی هر چند ساعت یبار این خطا یرای من ایمیل میشه :
Processing: App\Jobs\User\SendFirstSMSForCouponToUserJob
Symfony\Component\Debug\Exception\FatalErrorException : Maximum execution time of 30 seconds exceeded
خطا رو اصلا نمیفهمم ولی روشی که من برای حلش پیدا کردم موقتا و خیلی ابتدایی هست میرم توی کران جاب به جای schedule:run تا اخر مینویسم queur:work و یک دیقه صبر میکنم دوباره همون عبارت قبلی رو مینویسم درست میشه .
نمیدونم واقعا خطاش چیه. الان درست میشه اس ام اس ارسال میشه و خیلی خوب کار میکنه ولی چند ساغت بعد دوباره این خطا رو میده. جاب ها توی دیتابیس میخورن ولی ارسال نمیشن. باید حتما بیام به روشی که گفتم اجرا کنم تا ارسال بشن بعد دوباره برگردونم. ممنون میشم کمکم کنید
توی سرور باید کانفیگ فایروالتون رو تغییر بدید و این پروسس رو براش لیست سفید بزارید
سلام. وقتتون بخیر
اگه من بخوام ی سری محصول از دیتابیس بگیرم و اونا رو به ی کنترلر بفرستم که در صفحه اصلی اجرا میشه. چیکار باید بکنم؟
دقیق تر بخوام بگم نمونش توی قسمت پیشنهاد شگفت انگیز دیجی کالا هست که ساعت ۱۲ شب ریست میشه. من محصولات رو از دیتابیس گرفتم. چجوری باید بفرستمش به کنترلر مربوطه که کار کنه؟
ممنون میشم راهنمایی کنید
سلام
شما داری راه رو اشتباه میری نیازی نیست از صف بندی استفاده کنی برای اینکار
کافیه یک جدول درست کنی و بگی بین زمان فلان تا فلان چه محصولاتی نشون داده بشه
و توی صفحه اصلی وقتی رکوئست زده بشه نسبت به زمانی فعلی کوئری میزنه دیتابیس اگر محصولی باشه برمیگردونه و شما میتونید نشونشون بدید
با سلام و وقت بخیر
من داخل پروژم دوتا job دارم که برای اجراشون باید دستور php artisan queue:work رو میزدم دیگه.
من کاملا بر اساس این آموزش پیش رفتم، داخل لوکال هم تست کردم و درست بود. ولی روی هاست وقتی کرون جاب رو فعال میکنم این ارور رو بهم ایمیل میکنه
#!/usr/bin/env php
No scheduled commands are ready to run. لطفا راهنمایی کنید چند روزه منو درگیر کرده خیلی ممنونم.
این ارور میگه کاری برای انجام نیست بررسی کنید کدهاتون رو
مهندس دمت گرم.یطوری واضح توضیح دادی که حض کردم.عالی
۱۰ جا خوندم متوجه نمیشدم
خواهش میکنم بهنام جان
خوشحالم مفید بوده
@sara
مشکل استفاده از تابع withoutOverlapping هست زمانیکه این متد برای اولین بار اجرا شود. در فولدر storage/framework/cach/data فایل کشی ایجاد میشود که وجود این فایل مانع از اجرای مجدد میشود. حتی اگر برای اولین بار هم اجرا نشد شما لازم است یک بار دستور php artisan cache:clear را اجرا کنید تا کش ها خالی بشود.
@sara
لازم است که عددی به منزله دقیقه به عنوان آرگومان این متد داده شود. مثلا:
withoutOverlapping(2) واین به این معنی است که هر ۲ دقیقه قفل نرم افزاری زمانبند لاراول باز میشود تا زمانبند بعدی بتواند پس از آن شروع به کار کند.
اگر ورودی به این تابع ندهید به صورت پیشفرض هر ۲۴ ساعت یک بار زمانبند قابل اجرا است. تازه آن هم به این صورت که حتی اگر بیش از یک زمانبند تعریف کرده باشید به محض اجرای زمانبند اول قفل نرم افزاری فعال شده و سایر زمانبندهای بعدی کار نمیکنند.
به همین دلیل پیش نهاد می کنم که این متد را در آخرین زمانبند خود استفاده کنید.
منظورم از زمانبند هم کد زیر است که درفایل kernel.php واقع در شاخه app/console و در متد schedule آن نوشته میشود:
$schedule->command(‘queue:work –daemon’)->withoutOverlapping(2);
مرسی عالی بود هم جامع و هم کامل
فقط ی سری اپشین های جدیدم تو لاراول ۶ برای این تسک اومده بهتره اونام بزارید
وقت کنم چشم
داداش پایین سایتت نوشته تو فوتر :
بدون افتخار، نیرو گرفته از وردپرس فارسی
:))))))))))
آره میدونم 🙂
سلام واقعا ممنون
صدجا این صف و جاب رو خونده بودم آخر نفهمیدم چیه اما با توضیح شما کاملا فهمیدم
فقط یه چیزی چه جوری میشه هر صد ایمیل رو در یک صف تعریف کرد؟
میشه نمونه کدش رو بنویسید؟
ممنون
سلام نمونه ندارم الان
ولی شما میتونید داخل کد تا ۱۰۰ بشمارید و بعد یک delay برای صف های بعدی بزنید و دوباره تا ۱۰۰ بشماریید به همین شکل تا آخر
سلام می تونی دستور Artisan رو از خود laravel اجرا کنی خودش تو library هاش این امکانو بهت میده
Artisan\ اسم libraryشه..
با سلام و ممنون از مقاله بینظیرتون
آیا نباید دستور queue:restart هم لحاظ بشه؟؟
کلا این دستور برای چی هست؟ شنیدم لازمه اجرا بشه درسته؟
ادمین عزیز من این روش رو انجام دادم اما تا وقتی کران در حال اجراست Number Of Processes های سرورم ۷۷ درصد پر میشه
چرا؟
ممنون میشم راهنمایی کنید
ممنون که وقت گذاشتی و با این جزییات بیان کردی
خواهش میکنم محمد جان
موفق باشی
۰
سلام من یه مشکلی خوردم و نمیدونم باید چجوری حلش کنم
توی kernel من یکسری دستورات گذاشتم که مثلا هر ده دقیقه یه کاری بکنه هر بیست دقیقه یک کار دیگه بکنه و از طرفی یکسری job هم دارم که مثلا میخوام بگم job های default من رو هر بیست دقیقه یک بار اجرا کن و خب این کد رو هم توی kernel قرار میدم
$schedule->command(‘queue:work’)->everyFourMinutes();
ولی به محض اجرای این کد تمام job های default من اجرا میشه و دیگه هیچ کدوم از دستورات من که توی kernel نوشتم اجرا نمیشه مشکل از کجاست ضمن این که من توی local و داخل ویندوز دارم این کار رو انجام میدم لطفا راهنماییم کنید بدجوری گیج شدم ممنون
سلام مهدی جان
احتمالا جاب هات رو که ادد میکنی به صف براشون زمان دیلی نمیزاری و میگی همون لحظه اجرا بشه برای همین وقتی کیوورک ران میکنی همون لحظه همشون ارسال میشن
اگر تو دیتابیس داری جاب هات رو ادد میکنی تو دیتابیس برو و زمان اجرا شدن جاب هات رو نگاه کن
برای اینکه دیلی بدی به جاب هات موقع ایجادشون باید مقدار delay رو بهش بدی مثلا ۱۰ دقیقه بعد یا ۱ ساعت بعد یا هرچی
مستندات زیر رو بخون
https://laravel.com/docs/8.x/queues#delayed-dispatching
موفق باشی
سلام
ممنون بابت مطالب به اشتراک گذاشته شده
یه سوالی داشتم در مورد ارسال ایمیل یا اس ام اس
من اگر بخام به هزار یا چند هزار نفر ایمیل یا اس ام اس بفرستم همه اونها رو در کیو گذاشتم حالا چجور باید بگم که هر دقیقه ۲۰ تا از جدول جاب رو اجرا کنم، چجور بگم؟
همون کدهایی که شما در کرون جاب و اسکوجییل گفته بودید گذاشتم فقط نمیدونم چجور بگم هر دقیقه ۲۰ تا از جاب ها رو اجرا کن
سلام وقت بخیر
روی جابتون میتونید دیلی بزارید
دمت گرم خیلی حال کردم ، کامل و ساده توضیح داده بودی
خواهش میکنم حسین جان موفق باشی
عالی بود تشکر