依赖OpenAPI PHP Client包和OpenAPI PHP SDK包拉取轻量消息队列(原MNS)消息。
下载地址:
OpenAPI PHP Client:openapi-sdk-php-client
OpenAPI PHP SDK:openapi-sdk-php
Demo如下:
说明
调用接口前需配置环境变量,通过环境变量读取访问凭证。
AccessKey ID和AccessKey Secret的环境变量名:SECRET_AK_ENV 、SECRET_SK_ENV。配置详情请参见在Linux、macOS和Windows系统配置环境变量。
<?php
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Dybaseapi\MNS\Requests\BatchReceiveMessage;
use AlibabaCloud\Dybaseapi\MNS\Requests\BatchDeleteMessage;
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// 本示例以把AccessKey ID和AccessKey Secret保存在环境变量为例说明,来实现API访问的身份验证。
AlibabaCloud::accessKeyClient(getenv("SECRET_AK_ENV"), getenv("SECRET_SK_ENV"))
->regionId('cn-hangzhou')
->asGlobalClient();
$queueName = '<QueueName>'; // 队列名称
$messageType = '<MessageType>'; // 需要接收的消息类型
$response = null;
$token = null;
$i = 0;
do {
try {
if (null == $token || strtotime($token['ExpireTime']) - time() > 2 * 60) {
$response = AlibabaCloud::rpcRequest()
->product('Dybaseapi')
->version('2017-05-25')
->action('QueryTokenForMnsQueue')
->method('POST')
->host("dybaseapi.aliyuncs.com")
->options([
'query' => [
'MessageType' => $messageType,
'QueueName' => $queueName,
],
])
->request()
->toArray();
}
$token = $response['MessageTokenDTO'];
$mnsClient = new \AlibabaCloud\Dybaseapi\MNS\MnsClient(
"http://1943695596114318.mns.cn-hangzhou.aliyuncs.com",
$token['AccessKeyId'],
$token['AccessKeySecret'],
$token['SecurityToken']
);
$mnsRequest = new BatchReceiveMessage(10, 5);
$mnsRequest->setQueueName($queueName);
$mnsResponse = $mnsClient->sendRequest($mnsRequest);
$receiptHandles = Array();
foreach ($mnsResponse->Message as $message) {
// 用户逻辑:
// $receiptHandles[] = $message->ReceiptHandle; // 加入$receiptHandles数组中的记录将会被删除
$messageBody = base64_decode($message->MessageBody); // base64解码后的JSON字符串
print_r($messageBody . "\n");
}
if (count($receiptHandles) > 0) {
$deleteRequest = new BatchDeleteMessage($queueName, $receiptHandles);
$mnsClient->sendRequest($deleteRequest);
}
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
if ($e->getCode() == 404) {
$i++;
}
echo $e->getErrorMessage() . PHP_EOL;
}
} while ($i < 3);
文档内容是否对您有帮助?