使用tp5的thinkphp queue来实现订单语音通知
实现场景:用户下单后通知订单,如果在3分钟后还没有接单就语音通知提醒,这里用到的是阿里云的语音通知服务,
在tp5中使用composer来安装
1、安装阿里云语音通知SDK
composer require alibabacloud/dyvmsapi-20170525
安装think-queue服务
composer require topthink/think-queue
2、think-queue的配置文件在application/extra/queue.php,内容是:
这里需要自己安装redis,百度步骤即可。
3、消息的消费删除,建立一个文件来处理消息的逻辑
<?php /** * Created by PhpStorm. * User: Admin * Date: 2020/8/28 * Time: 14:59 */ namespace appapijob; use AlibabaCloudClientAlibabaCloud; use appapimodelRemind; use appapimodelUser; use GuzzleHttpExceptionClientException; use GuzzleHttpExceptionServerException; use thinkqueueJob; class Call { public function fire(Job $job,$data) { //....这里执行具体的任务 //$data是订单提醒的id,执行任务的时候查看是否还有remind $remind = (new Remind())->get($data); if ($remind){ echo 执行.$data; //如果存在,查找用户的电话 $user = (new User())->get($remind->user_id); // echo $user->phone; //将用户的电话传入 if ($this->call($user->phone)){ //如果任务执行成功后记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法 $job->delete(); }else{ if ($job->attempts() > 3) { //通过这个方法可以检查这个任务已经重试了几次了 $job->delete(); } } }else{ return; } // 也可以重新发布这个任务 //$job->release(60); //$delay为延迟时间 } public function call($phone) { AlibabaCloud::accessKeyClient(#######, #########) ->regionId(cn-hangzhou) ->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product(Dyvmsapi) // ->scheme(https) // https | http ->version(2017-05-25) ->action(SingleCallByVoice) ->method(POST) ->host(dyvmsapi.aliyuncs.com) ->options([ query => [ RegionId => "cn-hangzhou", CalledNumber => $phone, VoiceCode => "#########", CalledShowNumber => "", Volume => "100", PlayTimes => "3", Speed => "1", ], ]) ->request(); print_r($result->toArray()); return true; } catch (ClientException $e) { echo $e->getErrorMessage() . PHP_EOL; } catch (ServerException $e) { echo $e->getErrorMessage() . PHP_EOL; } } }
然后在需要创建消息的控制里,写
$isPushed = Queue::later(5,"appapijobCall", $data = $remind->id,"call");
5是延迟时间,$data是传递的数据,call是创建消息的名字。
4、在控制行输入命令来执行:
php think queue:work --queue call ------ 处理一个call的消息,处理完就结束
php think queue:work --daemon --queue call ---- 循环处理,可以一直监听消息
5、在linux上部署,并使用supervisor来监听消息的的处理在另一篇文章。