本文介绍消息服务的要求和安装说明。
示例的语言采用PHP,其他语言使用说明,参见 SDK使用手册。
环境要求
PHP 5.5+
安装
从阿里云下载消息服务的 PHP SDK。
从阿里云下载消息服务的PHP SDK。
示例的语言采用PHP,其他语言使用说明,参见 SDK使用手册。
解压到项目目录,解压后的目录名是php_sdk
。
示例代码
- 引用消息服务SDK
require_once(dirname(__FILE__).'/php_sdk/mns-autoloader.php');
- 初始化消息服务
MNS对用户的每个地域都配置了一个单独的服务域名,规则是:
https://${UserId}.mns.${Region}.aliyuncs.com
。示例代码使用的 华东1地域(cn-hangzhou),也可以替换为其他地域,例如: 华北2地域(cn-beijing)。use AliyunMNS\Client; use AliyunMNS\Exception\MnsException;
$mns_client = new Client('https://'.$user_id.'.mns.cn-hangzhou.aliyuncs.com', $access_key_id, $access_key_secret); $queue = $mns_client->getQueueRef($queue_name);
- 接收消息
MNS接收到的每条消息都对应一个句柄,后续可以使用句柄操作这条消息(例如:删除消息)。
另外,MNS支持批量接收消息来提高性能。详情参见MNS 批量消费消息。
接收消息时,可以指定超时时间(示例设置了3秒超时),如果队列中没有消息,会发生超时并触发异常。$receipt_handle = NULL; $message = null; try { $res = $queue->receiveMessage(3); echo "ReceiveMessage Succeed! \n"; $message = $res->getMessageBody(); $receipt_handle = $res->getreceiptHandle(); } catch (MnsException $e) { echo "ReceiveMessage Failed: " . $e . "\n"; }
- 删除消息
消息不会主动从队列删除,必须主动调用删除消息,否则消息会一直保持在队列中,下次还会继续接收到同一个消息。另外,删除消息操作必须在接收到消息后指定时间内调用才能成功,详情参见 消费服务-删除消息说明。
try { $res = $queue->deleteMessage($receipt_handle); echo "DeleteMessage Succeed! \n"; } catch (MnsException $e) { echo "DeleteMessage Failed: " . $e . "\n"; }
- 分析消息
消息体是字符串,内容是一个JSON对象,需要通过
json_decode
转换成对象,然后就可以分析JSON对象来获取详细信息了,示例打印了这次消息是哪个输出文件触发的媒体工作流执行。$json_message = json_decode($message); $input_file = $json_message->{'MediaWorkflowExecution'}->{'Input'}->{'InputFile'}; echo '输入文件 location:'.$input_file->{'Location'}. ' bucket:'.$input_file->{'Bucket'}. ' object:'.$input_file->{'Object'}."\n";
- 获取视频输出的详细信息。
获取到消息详细内容后,可以配合使用媒体库服务API获取工作流执行的视频详细信息。示例打印出这次转码和截图作业的输出地址。
如何安装和配置媒体库服务的PHP SDK,参考文档 媒体库SDK-PHP。include_once 'aliyun-php-sdk-core/Config.php'; use Mts\Request\V20140618 as Mts;
初始媒体库服务的client。$profile = DefaultProfile::getProfile('cn-hangzhou', $access_key_id, $access_key_secret); $mts_client = new DefaultAcsClient($profile);
打印所有转码作业的输出地址和基本信息。if (strcmp($json_message->{'Type'}, 'Report') == 0) { $activities = $json_message->{'MediaWorkflowExecution'}->{'ActivityList'}; $transcode_job_ids = Array(); for ($i=0; $i < count($activities); $i++) { if (strcmp($activities[$i]->{'Type'}, 'Transcode') == 0) { $transcode_job_ids[] = $activities[$i]->{'JobId'}; } } $request = new Mts\QueryJobListRequest(); $request->setJobIds(join(',', $transcode_job_ids)); $request->setRegionId('cn-hangzhou'); $response = $mts_client->getAcsResponse($request); for ($i=0; $i < count($response->{'JobList'}->{'Job'}); $i++) { $output = $response->{'JobList'}->{'Job'}[$i]->{'Output'}; $output_file = $response->{'JobList'}->{'Job'}[$i]->{'Output'}->{'OutputFile'}; $video_properties = $response->{'JobList'}->{'Job'}[$i]->{'Output'}->{'Properties'}; echo '转码输出文件URL '.'http://'.$output_file->{'Bucket'}.'.'. $output_file->{'Location'}.'.aliyuncs.com/'. urldecode($output_file->{'Object'})."\n"; echo '转码输出文件基本信息 '.$video_properties->{'Width'}.'x'.$video_properties->{'Height'}. ' duration:'.$video_properties->{'Duration'}."\n"; } }
打印所有截图作业的输出地址。if (strcmp($json_message->{'Type'}, 'Report') == 0) { $activities = $json_message->{'MediaWorkflowExecution'}->{'ActivityList'}; $snapshot_job_ids = Array(); for ($i=0; $i < count($activities); $i++) { if (strcmp($activities[$i]->{'Type'}, 'Snapshot') == 0) { $snapshot_job_ids[] = $activities[$i]->{'JobId'}; } } $request = new Mts\QuerySnapshotJobListRequest(); $request->setSnapshotJobIds(join(',', $snapshot_job_ids)); $request->setRegionId('cn-hangzhou'); $response = $mts_client->getAcsResponse($request); for ($i=0; $i < count($response->{'SnapshotJobList'}->{'SnapshotJob'}); $i++) { $snapshot_config = $response->{'SnapshotJobList'}->{'SnapshotJob'}[$i]->{'SnapshotConfig'}; $output_file = $response->{'SnapshotJobList'}->{'SnapshotJob'}[$i]->{'SnapshotConfig'}->{'OutputFile'}; echo '截图输出文件URL '.'http://'.$output_file->{'Bucket'}.'.'. $output_file->{'Location'}.'.aliyuncs.com/'. urldecode($output_file->{'Object'})."\n"; } }
在文档使用中是否遇到以下问题
更多建议
匿名提交