239
阿裏雲
PHP 收發消息__HTTP 接入(簡單)_消息隊列 MQ-阿裏雲
本文描述如何在 PHP 環境下用 HTTP 協議收發消息。
運行環境準備
用 HTTP 協議發送或者接收消息,請完成以下準備工作。
Windows
- 從 IntelliJ 官網下載並安裝 phpStorm 試用版:https://www.jetbrains.com/phpstorm/download/index.html
- 安裝完畢之後,打開 phpStorm 開發環境。
其他 IDE 開發環境安裝步驟與此類似。
Linux/Unix
從官網上下載 phpStorm 的 Linux 版本:https://www.jetbrains.com/phpstorm/download/index.html
解壓下載成功的 phpStorm 安裝包: tar xfz PhpStorm-2016.1.tar.gz
進入 phpStorm 的 bin 目錄並執行安裝腳本: cd phpStorm-2016.1;./phpStorm.sh
在輸入注冊碼頁麵直接單擊試用版。
單擊確定直到出現安裝完成界麵。
運行示例代碼
在Windows/Linux/Unix環境下,請按照以下步驟運行示例代碼。
在 phpStorm 中創建 PHP 工程(工程名無特殊要求)。
將下文具體示例程序中所提供的配置文件(config.ini)以及示例程序(httpProducer.php, httpConsumer.php, Util.php)拷貝到當前的工程中,如圖:

根據示例代碼裏的說明修改相關配置信息。
右鍵點擊創建的 PHP 文件,選擇 Run 執行。
注意:請先執行 httpProducer.php 代碼,再執行 httpConsumer.php 代碼。
觀察執行結果,如果執行結果有問題,請檢查 config.ini 配置是否正確。
具體示例程序
以下是配置文件(config.ini)、發送消息(httpProducer.php)和接收消息(httpConsumer.php)以及所用工具方法(Util.php)的示例代碼。
1. 配置文件
您需要設置配置文件(config.ini)的相關內容,具體請參考申請 MQ 資源。
[section]#您在控製台創建的TopicTopic = "xxx"#公測環境的URLURL = "https://publictest-rest.ons.aliyun.com"#阿裏雲身份驗證碼Ak = "xxx"#阿裏雲身份驗證密鑰Sk = "xxx"#MQ控製台創建的Producer IDProducerID = "xxx"#MQ控製台創建的Consumer IDConsumerID = "xxx"
說明: URL 中的 Key,Tag 以及 POST Content-Type 沒有任何的限製,隻要確保 Key 和 Tag 相同唯一即可,可以放在 user.properties 裏麵。
2. 發送消息示例程序(httpProducer.php)
通過 HTTP 協議發送消息,請參考以下示例代碼。
<?php//包含工具類include("Util.php");/** 消息發布者者*/class HttpProducer{//簽名private static $signature = "Signature";//在MQ控製台創建的Producer IDprivate static $producerid = "ProducerID";//阿裏雲身份驗證碼private static $aks = "AccessKey";//配置信息private static $configs = null;//構造函數function __construct(){//讀取配置信息$this::$configs = parse_ini_file("config.ini");}//計算md5private function md5($str){return md5($str);}//發布消息流程public function process(){//打印配置信息var_dump($this::$configs);//獲取Topic$topic = $this::$configs["Topic"];//獲取保存Topic的URL路徑$url = $this::$configs["URL"];//讀取阿裏雲訪問碼$ak = $this::$configs["Ak"];//讀取阿裏雲密鑰$sk = $this::$configs["Sk"];//讀取Producer ID$pid = $this::$configs["ProducerID"];//HTTP請求體內容$body = utf8_encode("阿裏巴巴");$newline = "n";//構造工具對象$util = new Util();for ($i = 0; $i<500; $i++) {//計算時間戳$date = time()*1000;//POST請求url$postUrl = $url."/message/?topic=".$topic."&time=".$date."&tag=http&key=http";//簽名字符串$signString = $topic.$newline.$pid.$newline.$this->md5($body).$newline.$date;//計算簽名$sign = $util->calSignatue($signString,$sk);//初始化網絡通信模塊$ch = curl_init();//構造簽名標記$signFlag = $this::$signature.":".$sign;//構造密鑰標記$akFlag = $this::$aks.":".$ak;//標記$producerFlag = $this::$producerid.":".$pid;//構造HTTP請求頭部內容類型標記$contentFlag = "Content-Type:text/html;charset=UTF-8";//構造HTTP請求頭部$headers = array($signFlag,$akFlag,$producerFlag,$contentFlag,);//設置HTTP頭部內容curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);//設置HTTP請求類型,此處為POSTcurl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST");//設置HTTP請求的URLcurl_setopt($ch,CURLOPT_URL,$postUrl);//設置HTTP請求的bodycurl_setopt($ch,CURLOPT_POSTFIELDS,$body);//構造執行環境ob_start();//開始發送HTTP請求curl_exec($ch);//獲取請求應答消息$result = ob_get_contents();//清理執行環境ob_end_clean();//打印請求應答結果var_dump($result);//關閉連接curl_close($ch);}}}//構造消息發布者$producer = new HttpProducer();//啟動消息發布者$producer->process();?>
3. 接收消息示例程序(httpConsumer.php)
通過 HTTP 協議接收消息,請參考以下示例代碼。
<?phpinclude ("Util.php");/** 消息訂閱者*/class HttpConsumer{//簽名private static $signature = "Signature";//Consumer IDprivate static $consumerid = "ConsumerID";//訪問碼private static $ak = "AccessKey";//配置信息private static $config = null;//構造函數function __construct(){//讀取配置信息$this::$config = parse_ini_file("config.ini");}//訂閱流程public function process(){//打印配置信息var_dump($this::$config);//獲取Topic$topic = $this::$config["Topic"];//獲取Topic的URL路徑$url = $this::$config["URL"];//阿裏雲身份驗證碼$ak = $this::$config["Ak"];//阿裏雲身份驗證密鑰$sk = $this::$config["Sk"];//Consumer ID$cid = $this::$config["ConsumerID"];$newline = "n";//構造工具對象$util = new Util();while (true){try{//構造時間戳$date = time()*1000;//簽名字符串$signString = $topic.$newline.$cid.$newline.$date;//計算簽名$sign = $util->calSignatue($signString,$sk);//構造簽名標記$signFlag = $this::$signature.":".$sign;//構造密鑰標記$akFlag = $this::$ak.":".$ak;//標記$consumerFlag = $this::$consumerid.":".$cid;//構造HTTP請求發送內容類型標記$contentFlag = "Content-Type:text/html;charset=UTF-8";//構造HTTP頭部信息$headers = array($signFlag,$akFlag,$consumerFlag,$contentFlag,);//構造HTTP請求URL$getUrl = $url."/message/?topic=".$topic."&time=".$date."&num=32";//初始化網絡通信模塊$ch = curl_init();//填充HTTP頭部信息curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);//設置HTTP請求類型,此處為GETcurl_setopt($ch,CURLOPT_CUSTOMREQUEST,"GET");//設置HTTP請求URLcurl_setopt($ch,CURLOPT_URL,$getUrl);//構造執行環境ob_start();//開始發送HTTP請求curl_exec($ch);//獲取請求應答消息$result = ob_get_contents();//清理執行環境ob_end_clean();//打印請求應答信息var_dump($result);//關閉HTTP網絡連接curl_close($ch);//解析HTTP應答信息$messages = json_decode($result,true);//如果應答信息中的沒有包含任何的Topic信息,則直接跳過if (count($messages) ==0){continue;}//依次遍曆每個Topic消息foreach ((array)$messages as $message){var_dump($message);//獲取時間戳$date = (int)($util->microtime_float()*1000);//構造刪除Topic消息URL$delUrl = $url."/message/?msgHandle=".$message['msgHandle']."&topic=".$topic."&time=".$date;//簽名字符串$signString = $topic.$newline.$cid.$newline.$message['msgHandle'].$newline.$date;//計算簽名$sign = $util->calSignatue($signString,$sk);//構造簽名標記$signFlag = $this::$signature.":".$sign;//構造密鑰標記$akFlag = $this::$ak.":".$ak;//構造消費者組標記$consumerFlag = $this::$consumerid.":".$cid;//構造HTTP請求頭部信息$delheaders = array($signFlag,$akFlag,$consumerFlag,$contentFlag,);//初始化網絡通信模塊$ch = curl_init();//填充HTTP請求頭部信息curl_setopt($ch,CURLOPT_HTTPHEADER,$delheaders);//設置HTTP請求URL信息curl_setopt($ch,CURLOPT_URL,$delUrl);//設置HTTP請求類型,此處為DELETEcurl_setopt($ch,CURLOPT_CUSTOMREQUEST,'DELETE');//構造執行環境ob_start();//開始發送HTTP請求curl_exec($ch);//獲取請求應答消息$result = ob_get_contents();//清理執行環境ob_end_clean();//打印應答消息var_dump($result);//關閉連接curl_close($ch);}}catch (Exception $e){//打印異常信息echo $e->getMessage();}}}}//構造消息訂閱者$consumer = new HttpConsumer();//啟動消息訂閱者$consumer->process();?>
4. 工具方法(Util.php)示例程序
示例中使用的工具方法如下。
<?php/** 工具類*/class Util{//計算簽名public static function calSignatue($str,$key){$sign = "";if(function_exists("hash_hmac")){$sign = base64_encode(hash_hmac("sha1",$str,$key,true));}else{$blockSize = 64;$hashfunc = "sha1";if(strlen($key) > $blockSize){$key = pack('H*',$hashfunc($key));}$key = str_pad($key,$blockSize,chr(0x00));$ipad = str_repeat(chr(0x36),$blockSize);$opad = str_repeat(chr(0x5c),$blockSize);$hmac = pack('H*',$hashfunc(($key^$opad).pack('H*',$hashfunc($key^$ipad).$str)));$sign = base64_encode($hmac);}return $sign;}//計算時間戳public static function microtime_float(){list($usec,$sec) = explode(" ",microtime());return ((float)$usec+(float)$sec);}}?>
最後更新:2016-11-23 16:04:13
上一篇:
Java 收發消息__HTTP 接入(簡單)_消息隊列 MQ-阿裏雲
下一篇:
Python 收發消息__HTTP 接入(簡單)_消息隊列 MQ-阿裏雲
AWS、阿裏雲等諸強競爭下,百度雲能否用ABC戰略突圍?
共享型虛擬主機收到被Ddos攻擊關停郵件的處理方法___安全問題_技術分享_雲虛機主機-阿裏雲
雲監控服務概覽__雲服務監控_用戶指南_雲監控-阿裏雲
步驟 1:數據源配置__創建監控任務_用戶指南_業務實時監控服務 ARMS-阿裏雲
增量同步__進階與深入_數據集成-阿裏雲
數據導入__快速入門_雲數據庫 Redis 版-阿裏雲
如何設置域名隱私保護服務?__域名安全_管理操作_域名-阿裏雲
Presto 使用說明__開源組件介紹_用戶指南_E-MapReduce-阿裏雲
滑動驗證Android/iOS使用說明__使用手冊_數據風控-阿裏雲
阿裏雲發布彈性高性能計算平台E-HPC 中國首款公共雲HPCaaS
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲
