• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP使用Redis队列执行定时任务实例讲解

    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使用Redis队列执行定时任务实例讲解的文章就介绍到这了,更多相关PHP使用Redis队列执行定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 详解PHP解决守护进程Redis假死
    • thinkphp5redis缓存新增方法实例讲解
    • php基于redis的分布式锁实例详解
    • Thinkphp5+Redis实现商品秒杀代码实例讲解
    • PHP操作Redis常用命令的实例详解
    • php在linux环境中如何使用redis详解
    • php操作redis命令及代码实例大全
    • php之redis短线重连案例讲解
    上一篇:laravel使用redis队列实例讲解
    下一篇:YII2 全局异常处理深入讲解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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