使用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来监听消息的的处理在另一篇文章。

经验分享 程序员 微信小程序 职场和发展