سلام من یه 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
واسه این که این یک ثانیه رو هم بتونم پوشش بدم هیچ ایده ای دارید ؟
مشکلش رو پیدا کردم مینویسم اینجا شاید یکی دیگه هم بر بخوره به مشکل من یک رو وقتمو گرفت 😅
توی فایل 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
}) ;
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟