1.首先查看项目中是否已经有think-queue目录:/vendor/topthink/
composer require topthink/think-queue
安装完成后,有think-queue文件夹,再运行
PHP think queue:work -h
查看是否安装成功,出现如下,则安装成功
2.配置队列,queue内置了四种驱动,推荐使用redis驱动。配置文件在application/extra/queue.PHP,如下
<?PHP use think\Env; return [ 'connector' => 'Redis', // Redis 驱动 'expire' => Env::get('queue.expire',60), // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null 'default' => 'default', // 默认的队列名称 'host' => Env::get('queue.host','127.0.0.1'), // redis 主机ip 'port' => Env::get('queue.port',6379), // redis 端口 'password' => Env::get('queue.password',''), // redis 密码 'select' => Env::get('queue.select',0), // 使用哪一个 db,默认为 db0 'timeout' => 0, // redis连接的超时时间 'persistent' => false, // 是否是长连接 ];
3.消息的创建和推送,首先要添加队列
<?PHP namespace app\common\controller; use think\Queue; class OrderQueue { static $className = 'app\common\job'; public static function createOrderQueue($jobData) { // 1.当前任务将由哪个类来负责处理。 // 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法 $jobHandlerClassName = self::$className.'\Order'; // 2.当前任务归属的队列名称,如果为新队列,会自动创建 $jobQueueName = "createOrderJob"; // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串 // ( jobData 为对象时,需要在此处手动序列化,否则只存储其public属性的键值对 ) // 4.将该任务推送到消息队列,等待对应的消费者去执行 $isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName ); // database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false if( $isPushed !== false ){ return true; }else{ return false; } } }
4.消息队列的执行
<?PHP namespace app\common\job; use app\common\model\ErrorLog; use think\queue\Job; class Order { /** * fire方法是消息队列默认调用的方法 * @param Job $job 当前的任务对象 * @param array|mixed $data 发布任务时自定义的数据 */ public function fire(Job $job,$data) { //业务处理代码,具体不贴出来了 $isJobDone = $this->create($data); if ($isJobDone) { // 如果任务执行成功, 记得删除任务 $job->delete(); }else{ if ($job->attempts() > 3) { //通过这个方法可以检查这个任务已经重试了几次了 $job->delete(); // 也可以重新发布这个任务 //print("<info>Hello Job will be availabe again after 2s."."</info>\n"); //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行 } } } private function create($data) { ErrorLog::insertLog('执行队列',__METHOD__,json_encode($data)); return true; } }
到此,所有代码准备完毕,经历了一个消息的 创建 -> 推送 -> 消费 -> 删除 的基本流程, 上面添加队列的代码只要放在任意一个控制器内就行,部分目录机构如下
5.启用队列的监听模式,队列的监听模式有两种,配置参数如下
只需要到项目根目录执行
PHP think queue:listen --queue createOrderJob
即可,具体根据项目实际情况加上不同的参数。而且我们具体是不能要让命令以守护进程执行。所以我们可以换成下面这条命令
nohup PHP think queue:listen --queue createOrderJob &
到此,整个消息队列就完成了
6.测试:
public function createOrder() { $data = [ 'order_id' => 1, ]; OrderQueue::createOrderQueue($data); }
转载:https://www.jianshu.com/p/e68e23f01490
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。