PHP使用Redis队列执行定时任务实例讲解


Posted in PHP onMarch 24, 2021

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(!empty(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']) && !empty($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);
PHP 相关文章推荐
PHP设计模式之代理模式的深入解析
Jun 13 PHP
php strrpos()与strripos()函数
Aug 31 PHP
php数组编码转换示例详解
Mar 11 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
php查看当前Session的ID实例
Mar 16 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
php阳历转农历优化版
Aug 08 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP实现爬虫爬取图片代码实例
Mar 03 PHP
windows系统php环境安装swoole具体步骤
Mar 04 PHP
YII2 全局异常处理深入讲解
Laravel的加密解密与哈希实例讲解
Mar 24 #PHP
laravel使用redis队列实例讲解
phpquery中文手册
Mar 18 #PHP
thinkphp5 路由分发原理
Mar 18 #PHP
is_file和file_exists效率比较
Mar 14 #PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
You might like
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
分享Python开发中要注意的十个小贴士
2016/08/30 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
夜班门卫岗位职责
2013/12/09 职场文书
中学教师管理制度
2014/01/14 职场文书
小学国庆节活动方案
2014/02/11 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
物流管理专业求职信
2014/05/29 职场文书
标准毕业生自荐信
2014/06/24 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript