温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP怎么使用Redis队列执行定时任务

发布时间:2021-03-20 13:45:37 来源:亿速云 阅读:443 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关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队列执行定时任务”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI