Amirilidan78
3 سال پیش توسط Amirilidan78 مطرح شد
1 پاسخ

بالا نگه داشتن command laravel برای همیشه

سلام من یه command نوشتم برای laravel که داخل App\Console هست
هدفم از ساخت این command اینه که subscribe کنم روی channel redis و بر اساس دستوراتی که دریافت میکنم یه سری کار بکنم

class RedisListener extends Command
{
    protected $signature = 'redis:listen';

    protected $description = 'Listen for events on redis channel';

    CONST ExternalChannel = "RedisPrefixMainMicroServiceChannel" ;
    CONST InternalChannel = "MainMicroServiceChannel" ;

    public function handle()
    {
        Redis::subscribe([self::InternalChannel],function ( $message ){
            /// TODO 
        });
    }

}

و با supervisor این دستور رو run میکنم و همه چیز خوب پیش میره

[program:microRedis]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/api/laravel/artisan redis:listen
user=octane
autostart=true
autorestart=true
numprocs=1
stdout_logfile=/var/log/redis.log
stdout_logfile_maxbytes=1024

ولی یه مشکلی رو پیدا کردم این دستور که توی supervisor گذاشتم بعد یک دقیقه terminate میشه یا اینو در نظر بگیریم که یک خطا رخ میده در اپلیکیشن و این دستور terminate میشه وقتی که autostart=true هست دوباره میخواد این command رو بیاره بالا تقریبا یک ثانیه طول میکشه تا دوباره subscribe کنه روی channel redis
واسه این که این یک ثانیه رو هم بتونم پوشش بدم هیچ ایده ای دارید ؟


ثبت پرسش جدید
Amirilidan78
تخصص : برنامه نویس وب
@Amirilidan78 3 سال پیش مطرح شد
0

مشکلش رو پیدا کردم مینویسم اینجا شاید یکی دیگه هم بر بخوره به مشکل من یک رو وقتمو گرفت 😅
توی فایل config/databas.php یه config هست به نام 'redis.default ' میتونین یکی از روش کپی کنین و بزارین زیرش و یه config بهش اضافه کنین به نام read_write_timeout به صورت دیفالت روی laravel 9 مقدارش هست 60 ثانیه اگه مقدارش رو بزارین 0 هیچ وقت process به خاطر اینکه connection ای دریافت نکرده بسته نمیشه
/config/database.php

'redis' => [
...
        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'redis-permanent-connection' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
            'read_write_timeout' => 0 , 
        ],
...

usage

Redis::connection("redis-permanent-connection")->subscribe([self::InternalChannel],function ( $message ){
            /// TODO 
        }) ;

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

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