队列方式接收通知

更新时间:2016-10-14 23:03:19

返回:简介 >>

接收消息通知-队列-PHP

这里简单介绍一下消息服务的要求和安装说明,详细请参考消息服务提供的文档:SDK下载队列使用手册

示例的语言采用PHP,其他语言使用说明,请参考消息服务提供的文档:SDK使用手册

  • 环境要求

    PHP 5.5+

  • 安装

    从Aliyun下载消息服务的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";
            }
       }
      

返回:简介 >>

results matching ""

    No results matching ""