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简介
Oct 09 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
什么是OneThink oneThink后台添加插件步骤
Apr 13 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 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
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Python探索之pLSA实现代码
2017/10/25 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Django中的AutoField字段使用
2020/05/18 Python
python 爬取小说并下载的示例
2020/12/07 Python
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
秋游活动策划方案
2014/02/16 职场文书
支部组织生活会方案
2014/06/10 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
初中作文评语集锦
2014/12/25 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏