زمانبندی وظایف

3 سال پیش توسط مهدی مطرح شد
آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

سئوال در خصوص لینک زیر هست
https://roocket.ir/articles/scheduled-tasks-in-laravel-shared-hosting#comment-16653
با اجرای دستور زیر
php artisan schedule:run

فقط یکبار اون کامندی که در زمانبند تعریف شده اجرا میشه و سیستم وارد حلقه تکرار اجرا نمیشه و نیازه که یه تسکی هم توی ویندوز ایجاد بشه (لوکال) آیا غیر از این روش که توی ویندوز تسکی برای اجرای کران جاب تعریف بشه وجود داره یا فقط همین راهکار هست
اصلا شروط اجرا شدن کران جاب در ویندوز چیه آیا سایت باید باز باشه
لطفا دوستان اگه اطلاعات کاملتری دارن توضیح بدن
و نظرتونو در خصوص کانکشن زدن به 200 تا دیتابیس در نقاط مختلف کشور بگید
برای همچین سناریویی چیکار میشه کرد
سپاس

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6499 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

سلام
باید کران جاب رو ست کنید که در ادامه ی همون مقاله توضیح داده شده

آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@amirhossein.d.z عزیز ممنون از پاسختون ولی ما نیاز به اجرای task ها رو سیستم لوکال با سیستم عامل ویندوز داریم

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6499 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

خواهش میکنم
در اینصورت باید ببینید ابزار لوکالتون برای اینکار چی هست
مثلا در ویندوز میتونید با استفاده از Task Scheduler ویندوز یه تسک با فرمان زیر بسازید(با توجه به آدرس پروژه و مسیر فایل اجرایی php) :

C:\xampp\php\php.exe C:\projects\project-name\artisan schedule:run
آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@amirhossein.d.z عزیز ممنون از پاسختون
با اینجال این امکان چندان نمیتونه برای ما کارایی داشته باشه چون یجورایی وابسته به سیستم عامل و سیستمی که تسک روش ست شده داره
هدف ما از این کار اینه در هر یک دقیقه حدود 200 تا کانکشن به چند سرور میخواییم بزینم و یه فیلدی از دیتابیسش رو بخونیم
بنظرتون بهترین راهکار برای این فرایند هم از لحاظ نوع کانکشن ها هم از نظر اجرای تسک وار این کوئری ها به چندین سرور در نقاط مختلف کشور چی میتونه باشه
سناریوی فعلی پروژه استفاده از تایمر جاوا اسکریپت در صفحه و فراخوانی یه تابع در هر دقیقه هست که داخل این تابع یا به قولی متد کانکشن ها ست شدن و فراخوانی اطلاعات انجام میشه
اصلا لاراول برای همچین کاری چه پیشنهاداتی داره که بشه هم زمانبدی کرد و دیگه لازم نباشه از ایجکس و تایمر جاوا اسکریپت استفاده کرد و هم اینکه کانکشن ها بصورت موازی فراخوانی بشن نه سریالی

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6499 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

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

آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@amirhossein.d.z بله دقیقا هدف همین هست
امکان این هم نیست که سرورها خودشون دیتارو بفرستن
ما باید کانکشن بزنیم و بخونیم از تکت تکشون و این اتفاق باید در هر دقیقه هم اتفاق بیفه

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6499 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

یه راهکاری که به ذهنم میرسه اینه که شما یک دیتابس واحد داشته باشی بنام مثلا A و توی هر کدوم از اون 200 تا دیتابیس یه تریگر تعریف کنی که هر موقع فیلد مورد نظر آپدیت شد یک آپدیت روی یک جدولی که در A تعریف کردی بزنن و شما فقط کافیه هر دفعه فقط به همین دیتابیس A درخواست بزنی و مقادیر اون تیبل رو دریافت کنی
برای انجام عملیات روی یک تیبل از دیتابیس ریموت توی mysql نیاز به FEDERATED Storage Engine هست :
https://dev.mysql.com/doc/refman/5.6/en/federated-storage-engine.html

آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

@amirhossein.d.z دوست داشتنی که پاسخ های خوب میدی
ولی مشکلی که هست نمیتونیم از هیچکدوم از اون سرورها به دیتابیس و تیبل دیگه ای عملیات insert انجام بدیم و تنها دسترسی عمل read هست و programming باید در همین یه سرور انجام بشه

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6499 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

خب ظاهرا چاره ای نیست. باید توی لاراول به تعداد دیتابیسهایی که داری کانکشن درست کنی و مثلا داخل یه حلقه به هر کدوم وصل بشی و عملیاتی که میخوای رو انجام بدی. اما چون داری کار سنگینی رو انجام میدی بهتره queue بشه. میتونی براش یه کلاس جاب درست کنی :
https://laravel.com/docs/5.7/queues#creating-jobs
و بعد داخل متد schedule از کلاس Kernel :

$schedule->job(new MyJob())
  ->everyMinute();

در نهایت دستور artisan schedule:run هم باید کران جاب بشه روی سیستم به ازای هر دقیقه

آفلاین
user-avatar
مهدی ( 1735 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

0

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

آفلاین
user-avatar
محمد صادقیان ( 35723 تجربه )
3 سال پیش
تخصص : برنامه نویس وب - فریم ورک Laravel

لینک کوتاه اشتراک گذاری

0

@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\[email protected]_message')->cron('* * * * *');
برای ارسال پاسخ لازم است، ابتدا وارد سایت شوید.