PHP使用Redis队列执行定时任务实例讲解
发布:smiling 来源: PHP粉丝网 添加日期:2022-04-20 11:06:25 浏览: 评论:0
这篇文章主要介绍了PHP使用Redis队列执行定时任务实例讲解,redis队列是比较常用的功能,有感兴趣的同学可以学习下。
Redis类:
- <?php
- namespace Utils;
- use Phalcon\Config\Adapter\Ini as ConfigIni;
- class Redis{
- private static $redis1;
- private static $session;
- /**
- * 获取一个单例的redis对象
- * @param string $name
- * @return \Redis
- */
- public static function getObj($name='redis1')
- {
- try{
- if(!emptyempty(self::$$name)){
- return self::$$name;
- }
- $config = new ConfigIni(APP_PATH."/config".ENV."/redis.ini");
- self::$$name = new \Redis();
- self::$$name->connect($config[$name]['host'], $config[$name]['port'],2);
- if(isset($config[$name]['password']) && !emptyempty($config[$name]['password'])){
- self::$$name->auth($config[$name]['password']);
- }
- self::$$name->select($config[$name]['database']);
- }catch (\Exception $exception){
- self::$$name = false;
- }
- return self::$$name;
- }
- };
定时任务:
- /**
- * 订单任务
- */
- public function orderAction()
- {
- error_reporting(E_ALL & ~E_NOTICE);
- $redis = Redis::getObj();
- //获取数据库连接实例
- $db = $this->getDI()->getShared('db');
- while (true) {
- print_r(' -start- ');
- $order_status = 1;
- file_put_contents(APP_PATH . "/../domain_order.log", time());
- try {
- //防止长时间无任务导致MySQL超时
- $db->query("select 1");
- //出列
- $order_info = $redis->lPop('order');
- if (!$order_info) {//队列为空时暂停
- echo ' -empty- ';
- sleep(1);
- continue;
- }
- $order_info = json_decode($order_info, true);
- $model_order_info = NetUserOrder::findFirst(['order_sn = :order_sn:','bind'=>['order_sn'=>$order_domain_info_save->order_sn]]);
- //未支付
- if($model_order_info->pay_status != 200){
- echo 'no pay';
- continue;
- }
- //已操作
- if ($order_domain_info_save->order_status == 3) {
- echo ' -Operated- ';
- continue;
- }
- //事务开始
- $db->begin();
- ##
- 这里执行订单流程操作
- ##
- $order_status = 3;//操作成功
- //修改订单状态
- $order_domain_info_save->order_status = $order_status;
- $order_domain_info_save->operation_time = time();
- $order_domain_info_save->update();
- }
- //提交事务
- $db->commit();
- printf('### succ order_id' . $order_info['id'] . ' ###');
- } catch (\Exception $e) {
- //回滚事务
- $db->rollback();
- $order_status = 2;//操作失败
- $order_domain_info_save->order_status = $order_status;
- $order_domain_info_save->operation_time = time();
- $order_domain_info_save->update();
- printf(' error ' . $e->getMessage() . ' ');
- //异常,发送通知
- Log::error($e->getMessage());
- $redis->hSet('order_domain_retry', 'domain_retry_' . $order_info['id'], json_encode($order_info));
- }
Redis常用队列方法:
- //队列第一个 =>出列
- $Redis->lPop($key);
- //入到 =>队列最后
- $Redis->rPush($key);
- //队列最后一个 =>出列
- $Redis->rPop($key);
- //入到 =>队列第一个
- $Redis->rPop($key);
- //返回整个列表的值,不出列
- $redis->lRange($key,0,-1);
Tags: Redis队列 PHP定时任务
- 上一篇:PHP如何限制定时任务的进程数量
- 下一篇:最后一页
相关文章
- ·php定时执行任务实现方法详解(2014-08-27)
- ·PHP定时任务获取微信access_token的例子(2018-10-31)
- ·php workerman定时任务的实现代码(2021-11-03)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)