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加速 eAccelerator配置和使用指南
Jun 05 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
Apr 28 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
比较完整的微信开发php代码
Aug 02 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP实现微信图片上传到服务器的方法示例
Jun 29 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 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
如何做到多笔资料的同步
2006/10/09 PHP
php中看实例学正则表达式
2006/12/25 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
js实现照片墙功能实例
2015/02/05 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
python实现人脸识别代码
2017/11/08 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python实现图片彩色转化为素描
2019/01/15 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
python基于opencv检测程序运行效率
2019/12/28 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
护士节慰问信
2015/02/15 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
在CSS中使用when/else的方法
2022/01/18 HTML / CSS