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文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php mysql索引问题
Jun 07 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php实现加减法验证码代码
Feb 14 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
重新认识php array_merge函数
Aug 31 PHP
php限制ip地址范围的方法
Mar 31 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 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
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
javascript 获取图片颜色
2009/04/05 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
jQuery常用选择器详解
2017/07/17 jQuery
老生常谈javascript的面向对象思想
2017/08/22 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
林肯就职演讲稿
2014/05/19 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
创业计划书之物流运送
2019/09/17 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
Redis唯一ID生成器的实现
2022/07/07 Redis
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android