Laravel Redis键过期,supervisor 进程管理实现15分钟取消订单

1、自动取消订单考虑到Redis键过期进行处理,修改Redis配置文件,并重启Redis
复制代码
notify-keyspace-events "Ex"
2、Laravel安装Redis扩展
复制代码
composer require predis/predis
3、Laravel配置Redis连接
复制代码
这里不详细介绍,.env  config\database.php 配置即可
4、建立任务文件
复制代码
php artisan make:command OrderCloseExpireListen

app\Console\Commands\OrderCloseExpireListen

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Log;
class OrderCloseExpireListen extends Command
{
/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'orderClose:expire';

/**
 * The console command description.
 *
 * @var string
 */
protected $description = '15分钟自动取消订单';

/**
 * Create a new command instance.
 *
 * @return void
 */
public function __construct()
{
    parent::__construct();
}

/**
 * @param $number
 * @return false|string
 */
public function str_after($number){
    $str = substr($number,strripos($number,":")+1);
    return $str;
}

/**
 * @param $number
 * @return false|string
 */
public function str_before($number){
    $str = substr($number,0,strrpos($number,":"));
    return $str;
}


/**
 * Execute the console command.
 *
 * @return int
 */
public function handle()
{
    $db = config('database.redis.default.database', 0); // 监听的数据库
    $pattern = '__keyevent@'. $db . '__:expired'; // 监听事件:键过期事件
    Redis::subscribe([$pattern], function ($channel) { // 订阅键过期事件,$channel为返回的键名
        $key_type = $this->str_before($channel);
		if($key_type == 'ORDER_CLOSE_ID'){
		    $order_id = $this->str_after($channel);    // 获取订单ID
            $order = (new Order())->getOne(['id'=>(int)$order_id]);
			//取消订单业务逻辑
		}           
    });
}

}

4、执行
复制代码
php artisan orderClose:expire
使用supervisor进程管理
centos 安装: yum install supervisor 
启动服务:supervisord -c /etc/supervisord.conf
修改配置:vim /etc/supervisord.conf
files = supervisord.d/\*.conf // 注意:编译器问题用的时候去掉\
cd /etc/supervisord.d/
vim orderClose.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /项目目录/artisan orderClose:expire
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stderr_logfile=/etc/supervisord.d/log/ossoffical.err.log #错误日志文件
stdout_logfile=/etc/supervisord.d/log/ossoffical.out.log #输出日志文件

supervisorctl reload  //重新加载配置文件
5、存Redis
复制代码
Redis::set('ORDER_CLOSE_ID:1', 1, 'EX', 900); // 设置ORDER_CLOSE_ID:1这个键15分钟后过期
相关推荐
DigitalOcean1 天前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
两个人的幸福3 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
用户3169353811835 天前
Java连接Redis
redis
BingoGo6 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack6 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982076 天前
PHP 扩展——从入门到理解
php
鹏仔先生7 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
小小工匠7 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
云水一下7 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip7 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua