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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
解析MySql与Java的时间类型
Jun 22 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
Laravel框架自定义分页样式操作示例
Jan 26 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实现mysql同步的实现方法
2009/10/21 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
require.js的用法详解
2015/10/20 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
python字典多条件排序方法实例
2014/06/30 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
OpenCV实现人脸识别
2017/04/07 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
出国留学自荐信
2013/10/25 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
法定代表人证明书
2014/11/28 职场文书
玄武湖导游词
2015/02/05 职场文书
交通事故调解协议书
2015/05/20 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python