当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP使用Redis队列执行定时任务实例讲解

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-20 11:06:25 浏览: 评论:0 

这篇文章主要介绍了PHP使用Redis队列执行定时任务实例讲解,redis队列是比较常用的功能,有感兴趣的同学可以学习下。

Redis类:

  1. <?php 
  2.   namespace Utils; 
  3.  
  4.   use Phalcon\Config\Adapter\Ini as ConfigIni; 
  5.  
  6.   class Redis{ 
  7.     private static $redis1
  8.     private static $session
  9.  
  10.     /** 
  11.      * 获取一个单例的redis对象 
  12.      * @param string $name 
  13.      * @return \Redis 
  14.      */ 
  15.     public static function getObj($name='redis1'
  16.     { 
  17.       try{ 
  18.         if(!emptyempty(self::$$name)){ 
  19.           return self::$$name
  20.         } 
  21.         $config = new ConfigIni(APP_PATH."/config".ENV."/redis.ini"); 
  22.         self::$$name = new \Redis(); 
  23.         self::$$name->connect($config[$name]['host'], $config[$name]['port'],2); 
  24.         if(isset($config[$name]['password']) && !emptyempty($config[$name]['password'])){ 
  25.           self::$$name->auth($config[$name]['password']); 
  26.           
  27.         } 
  28.         self::$$name->select($config[$name]['database']); 
  29.       }catch (\Exception $exception){ 
  30.         self::$$name = false; 
  31.       } 
  32.       return self::$$name
  33.  
  34.     } 
  35.  
  36.  
  37.   }; 

定时任务:

  1. /** 
  2.  * 订单任务 
  3.  */ 
  4. public function orderAction() 
  5.   error_reporting(E_ALL & ~E_NOTICE); 
  6.   $redis = Redis::getObj(); 
  7.   //获取数据库连接实例 
  8.   $db = $this->getDI()->getShared('db'); 
  9.   while (true) { 
  10.     print_r(' -start- '); 
  11.     $order_status = 1; 
  12.     file_put_contents(APP_PATH . "/../domain_order.log", time()); 
  13.     try { 
  14.       //防止长时间无任务导致MySQL超时 
  15.       $db->query("select 1"); 
  16.       //出列 
  17.       $order_info = $redis->lPop('order'); 
  18.       if (!$order_info) {//队列为空时暂停 
  19.         echo ' -empty- '
  20.         sleep(1); 
  21.         continue
  22.       } 
  23.       $order_info = json_decode($order_info, true); 
  24.       $model_order_info = NetUserOrder::findFirst(['order_sn = :order_sn:','bind'=>['order_sn'=>$order_domain_info_save->order_sn]]); 
  25.       //未支付 
  26.       if($model_order_info->pay_status != 200){ 
  27.         echo 'no pay'
  28.         continue
  29.       } 
  30.       //已操作 
  31.       if ($order_domain_info_save->order_status == 3) { 
  32.         echo ' -Operated- '
  33.         continue
  34.       } 
  35.       //事务开始 
  36.       $db->begin(); 
  37.       ## 
  38.       这里执行订单流程操作 
  39.       ## 
  40.  
  41.       $order_status = 3;//操作成功 
  42.  
  43.       //修改订单状态 
  44.       $order_domain_info_save->order_status = $order_status
  45.       $order_domain_info_save->operation_time = time(); 
  46.       $order_domain_info_save->update(); 
  47.       } 
  48.  
  49.       //提交事务 
  50.       $db->commit(); 
  51.       printf('### succ order_id' . $order_info['id'] . ' ###'); 
  52.     } catch (\Exception $e) { 
  53.       //回滚事务 
  54.       $db->rollback(); 
  55.       $order_status = 2;//操作失败 
  56.  
  57.       $order_domain_info_save->order_status = $order_status
  58.       $order_domain_info_save->operation_time = time(); 
  59.       $order_domain_info_save->update(); 
  60.  
  61.       printf(' error ' . $e->getMessage() . ' '); 
  62.       //异常,发送通知 
  63.       Log::error($e->getMessage()); 
  64.         $redis->hSet('order_domain_retry''domain_retry_' . $order_info['id'], json_encode($order_info)); 
  65.     } 

Redis常用队列方法:

  1. //队列第一个 =>出列 
  2. $Redis->lPop($key); 
  3. //入到 =>队列最后 
  4. $Redis->rPush($key); 
  5.  
  6. //队列最后一个 =>出列 
  7. $Redis->rPop($key); 
  8. //入到 =>队列第一个 
  9. $Redis->rPop($key); 
  10.  
  11. //返回整个列表的值,不出列 
  12. $redis->lRange($key,0,-1);

Tags: Redis队列 PHP定时任务

分享到: