راکت

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

8 پاسخ

سلام دوستان

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

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

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

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

coarad supp
coarad supp
@coaradsupp
ثبت پرسش جدید

پاسخ‌ها

8
سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

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

artisan queue:work --stop-when-empty

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

coarad supp
coarad supp
@coaradsupp

تخصص: برنامه نویس لاراول

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

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

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

شاید پاسخ شما همین‌جا باشد

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

coarad supp
coarad supp
@coaradsupp

تخصص: برنامه نویس لاراول

@juza66

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

artisan queue:work --stop-when-empty

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

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

coarad supp
coarad supp
@coaradsupp

تخصص: برنامه نویس لاراول

@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
coarad supp
@coaradsupp

تخصص: برنامه نویس لاراول

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

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

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