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配置心得包含MYSQL5乱码解决
Nov 20 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
Feb 16 PHP
php数组编码转换示例详解
Mar 11 PHP
Smarty中调用FCKeditor的方法
Oct 27 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
php常用表单验证类用法实例
Jun 18 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 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
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
python文件与目录操作实例详解
2016/02/22 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
人事主管的岗位职责
2013/11/16 职场文书
中学家长会邀请函
2014/01/17 职场文书
市场部规章制度
2014/01/24 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
大学生村官考核材料
2014/05/23 职场文书
单位工作证明书格式
2014/10/04 职场文书
2014年学生工作总结
2014/11/20 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技