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
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
phpnow php探针环境检测代码
Nov 04 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
php实现图片上传、剪切功能
May 07 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
Jun 05 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仿discuz分页效果代码
2008/10/02 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
javascript时间函数大全
2014/06/30 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
three.js 入门案例详解
2018/01/23 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python logging日志模块的详解
2017/10/29 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
pytorch梯度剪裁方式
2020/02/04 Python
Python实现结构体代码实例
2020/02/10 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
应届行政管理专业个人自我评价
2013/12/28 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
志愿者活动总结范文
2014/04/26 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis