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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
php的access操作类
Apr 09 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
php实现aes加密类分享
Feb 16 PHP
PHP检测用户语言的方法
Jun 15 PHP
8个PHP数组面试题
Jun 23 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
php分享朋友圈的实现代码
Feb 18 PHP
Yii框架的路由配置方法分析
Sep 09 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数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
php对象工厂类完整示例
2018/08/09 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
php链式操作的实现方式分析
2019/08/12 PHP
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python实现的选择排序算法示例
2017/11/29 Python
python opencv之SURF算法示例
2018/02/24 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
python内存动态分配过程详解
2019/07/15 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python中pivot()函数基础知识点
2021/01/03 Python
国际政治个人自荐信范文
2013/11/26 职场文书
单位租车协议书
2015/01/29 职场文书
暗恋桃花源观后感
2015/06/12 职场文书