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
详解:――如何将图片储存在数据库里
Dec 05 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
php文件类型MIME对照表(比较全)
Oct 07 PHP
php中static和const关键字用法分析
Dec 07 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
laravel-admin 实现在指定的相册下添加照片
Oct 21 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 各种应用乱码问题的解决方法
2010/05/09 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python标准库之循环器(itertools)介绍
2014/11/25 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python实现下载文件的三种方法
2017/02/09 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
班主任经验交流会主持词
2014/04/01 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
教师节班会开场白
2015/06/01 职场文书
2016七夕情人节感言
2015/12/09 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python