本文介紹Message Service的要求和安裝說明。

詳情參見 SDK下載隊列使用手冊

樣本的語言採用PHP,其他語言使用說明,參見 SDK使用手冊

環境要求

PHP 5.5+

安裝

從Aliyun下載Message Service的 PHP SDK

解壓到項目目錄,解壓後的目錄名是php_sdk

範例程式碼

  • 引用Message ServiceSDK
    require_once(dirname(__FILE__).'/php_sdk/mns-autoloader.php');
  • 初始化Message Service
    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";
          }
     }