سئوال در خصوص لینک زیر هست
https://roocket.ir/articles/scheduled-tasks-in-laravel-shared-hosting#comment-16653
با اجرای دستور زیر
php artisan schedule:run
فقط یکبار اون کامندی که در زمانبند تعریف شده اجرا میشه و سیستم وارد حلقه تکرار اجرا نمیشه و نیازه که یه تسکی هم توی ویندوز ایجاد بشه (لوکال) آیا غیر از این روش که توی ویندوز تسکی برای اجرای کران جاب تعریف بشه وجود داره یا فقط همین راهکار هست
اصلا شروط اجرا شدن کران جاب در ویندوز چیه آیا سایت باید باز باشه
لطفا دوستان اگه اطلاعات کاملتری دارن توضیح بدن
و نظرتونو در خصوص کانکشن زدن به 200 تا دیتابیس در نقاط مختلف کشور بگید
برای همچین سناریویی چیکار میشه کرد
سپاس
@amirhossein.d.z عزیز ممنون از پاسختون ولی ما نیاز به اجرای task ها رو سیستم لوکال با سیستم عامل ویندوز داریم
خواهش میکنم
در اینصورت باید ببینید ابزار لوکالتون برای اینکار چی هست
مثلا در ویندوز میتونید با استفاده از Task Scheduler ویندوز یه تسک با فرمان زیر بسازید(با توجه به آدرس پروژه و مسیر فایل اجرایی php) :
C:\xampp\php\php.exe C:\projects\project-name\artisan schedule:run
@amirhossein.d.z عزیز ممنون از پاسختون
با اینجال این امکان چندان نمیتونه برای ما کارایی داشته باشه چون یجورایی وابسته به سیستم عامل و سیستمی که تسک روش ست شده داره
هدف ما از این کار اینه در هر یک دقیقه حدود 200 تا کانکشن به چند سرور میخواییم بزینم و یه فیلدی از دیتابیسش رو بخونیم
بنظرتون بهترین راهکار برای این فرایند هم از لحاظ نوع کانکشن ها هم از نظر اجرای تسک وار این کوئری ها به چندین سرور در نقاط مختلف کشور چی میتونه باشه
سناریوی فعلی پروژه استفاده از تایمر جاوا اسکریپت در صفحه و فراخوانی یه تابع در هر دقیقه هست که داخل این تابع یا به قولی متد کانکشن ها ست شدن و فراخوانی اطلاعات انجام میشه
اصلا لاراول برای همچین کاری چه پیشنهاداتی داره که بشه هم زمانبدی کرد و دیگه لازم نباشه از ایجکس و تایمر جاوا اسکریپت استفاده کرد و هم اینکه کانکشن ها بصورت موازی فراخوانی بشن نه سریالی
ینی شما 200 تا دیتابیس در سرورهای مجزا داری که میخوای از هر کدوم یک فیلدی رو برگردونی در یک کلاینت؟
@amirhossein.d.z بله دقیقا هدف همین هست
امکان این هم نیست که سرورها خودشون دیتارو بفرستن
ما باید کانکشن بزنیم و بخونیم از تکت تکشون و این اتفاق باید در هر دقیقه هم اتفاق بیفه
یه راهکاری که به ذهنم میرسه اینه که شما یک دیتابس واحد داشته باشی بنام مثلا A و توی هر کدوم از اون 200 تا دیتابیس یه تریگر تعریف کنی که هر موقع فیلد مورد نظر آپدیت شد یک آپدیت روی یک جدولی که در A تعریف کردی بزنن و شما فقط کافیه هر دفعه فقط به همین دیتابیس A درخواست بزنی و مقادیر اون تیبل رو دریافت کنی
برای انجام عملیات روی یک تیبل از دیتابیس ریموت توی mysql نیاز به FEDERATED Storage Engine هست :
https://dev.mysql.com/doc/refman/5.6/en/federated-storage-engine.html
@amirhossein.d.z دوست داشتنی که پاسخ های خوب میدی
ولی مشکلی که هست نمیتونیم از هیچکدوم از اون سرورها به دیتابیس و تیبل دیگه ای عملیات insert انجام بدیم و تنها دسترسی عمل read هست و programming باید در همین یه سرور انجام بشه
خب ظاهرا چاره ای نیست. باید توی لاراول به تعداد دیتابیسهایی که داری کانکشن درست کنی و مثلا داخل یه حلقه به هر کدوم وصل بشی و عملیاتی که میخوای رو انجام بدی. اما چون داری کار سنگینی رو انجام میدی بهتره queue بشه. میتونی براش یه کلاس جاب درست کنی :
https://laravel.com/docs/5.7/queues#creating-jobs
و بعد داخل متد schedule از کلاس Kernel :
$schedule->job(new MyJob())
->everyMinute();
در نهایت دستور artisan schedule:run هم باید کران جاب بشه روی سیستم به ازای هر دقیقه
امیر حسین عزیز ممنون که وقت گذاشتی و نوشتی
ولی بنظر میرسه راهکارهای بهتری هم توی لاراول وجود داشته باشه برای اینکار
از دوستان دیگه کسی اگه هست که کار کردن با همچین سناریویی نظرشونو بزارن ممنون میشم
@hesami13
اینو باید از طریق هاستتون و بخش CronJobs تعریف کنید که هرچند یک بار کامند Schedule:run رو اجرا کنه تا هر بار توابعتون اجرا بشه.
مثلا من برای کار خودم کد زیر رو تعریف کردم.
/usr/local/bin/php /home3/drcodeir/dr-code.ir/instagram/artisan schedule:run 2>&1 > /home3/drcodeir/dr-code.ir/instagram/storage/cron.log
این هربار دستور Schedule:run رو اجر می کنه و هر دستوری که در فایل Kernel.php هست رو run می کنه.
حتی می تونید از فایل Kernel.php به توابع نوشته شده هم اشاره کنید. به صورت زیر :
$schedule->call('\App\Http\Controllers\BarberBotController@send_message')->cron('* * * * *');
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟