coarad supp
4 سال پیش توسط coarad supp مطرح شد
8 پاسخ

استفاده از scheduler و صف ها

سلام دوستان

میخواستم از صف ها توی لاراول استفاده کنم؛ روی لوکال هستم و توی schedule ویندوز یه کران جاب گذاشتم که هر یه دیقه scheduler لاراول رو ران کنه، توی تابع schedule این کد رو گذاشتم

info('schedule run');
        $schedule->command('queue:restart')
                 ->everyFiveMinutes();

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

حالا وقتی فایل لاگ رو نگا میکنم هر یه دیقه اون متن چاپ میشه ولی صف من اجرا نمیشه،
و با queue:listen امتحان کردم، و صف اجرا شد ولی اینبار اون متن هر 3 ثانیه چاپ میشه، میخواستم بدونم روند این کار چطوریه؟ روی سرور به چه شکل میشه؟ کدومش درسته؟


ثبت پرسش جدید
سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش مطرح شد
0

دستور‌ کرون جاب شما در‌هاست هر یک دقیقه ست شده؟ بعدش توی کرنل کنسول شما اسکجول شما هر یک‌دقیقه قرار queue:work رو اجرا کنه؟ این میشه دو دقیقه یکبار :)

الان شما از کامند queue :work استفاده میکنید باید اجرا کنه‌ درسته؟ اجرا میشه دیگه؟؟

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

artisan queue:work --stop-when-empty

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


coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
0

ممنون اقای موسوی

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

الان همون یه دیقه که ویندوز اسکجول رو ران میکنه و اون متن چاپ میشه، ولی صف اجرا نمیشه، ولی با listen تست میکنم، اجرا میشه ولی دیگه او متن هر سه ثانیه چاپ میشه


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش مطرح شد
0

فعلا روی سیستم خودت مستقیما دستور queue:work رو اجرا کن و استفاده کن با این دستور صف ها بلافاصله اجرا میشن


coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
0

@juza66

بله، حرف شما متین، ولی میخواستم شبیه به سرور اسکجول ران کنه صف رو که ببینم چطوریه،
حالا با این

artisan queue:work --stop-when-empty

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش آپدیت شد
0

اگر از اسجول استفاده کردین و هر یک دقیقه یکبار چک میکنه اگر چیزی در صف داشته باشید اجرا میکنه در غیر اینصورت کامند queue:work اجرا نمیشه، اینکه سه بار اجرا حتما توی تیبل queue شما سه بار داشتینش وگرنه این دستور قرار نیست 3 بار کامند اجرا کنه.

شما بررسی کنید دستوراتی که دارین یا job اگر تعریف کردین یا event اگر تعریف شده اونجا باید بگردین و ببینید برای چی 3 بار درخواست شما در تیبل صف ها قرار گرفته یا ۳ بار چاپ شده

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


coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
0

@juza66
سلام مجدد؛ ممنون واسه توضیحاتتون

protected function schedule( Schedule $schedule ) {
        info('schedule run');
        $schedule->command('queue:restart')
                 ->everyFiveMinutes();

        $schedule->command('queue:work --stop-when-empty')
                 ->everyMinute()->withoutOverlapping();
    }

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

class ChatNotAnswer implements ShouldQueue {
    use Dispatchable , InteractsWithQueue , Queueable , SerializesModels;
    public $chat;

    public function __construct( Chat $chat ) {
        $this->chat = $chat;
        info( 5555 );
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle() {
        info( 66666 );
        if ( ! $this->chat->answers->count() ) {
            event( new SendNotifyToUser( $this->chat ) );
            $this->release( 20 );
        }
    }
}

فراخوانی

$this->dispatch( ( new ChatNotAnswer( $chat ) )->delay( Carbon::now()->addSeconds(20) ) );

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


coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
0

@juza66
این عکس هم از لاگ هست که هر دیقه داره دو بار اون متن رو چاپ میکنه در صورتی که جدول جاب ها خالی هست
توضیح تصویر رو وارد کنید


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

این مشکل حل شد؟


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

ورود یا ثبت‌نام