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 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
PHP7.1新功能之Nullable Type用法分析
Sep 26 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
laravel自定义分页效果
Jul 23 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 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文件上传实例详解!!!
2007/01/02 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
tensorflow之并行读入数据详解
2020/02/05 Python
python批量生成条形码的示例
2020/10/10 Python
python request 模块详细介绍
2020/11/10 Python
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
家长给老师的道歉信
2014/01/13 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
廉洁自律个人总结
2015/02/14 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
2016入党心得体会范文
2016/01/06 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
使用HttpSessionListener监听器实战
2022/03/17 Java/Android
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL