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]
#您在控製台創建的Topic
Topic = "xxx"
#公測環境的URL
URL = "https://publictest-rest.ons.aliyun.com"
#阿裏雲身份驗證碼
Ak = "xxx"
#阿裏雲身份驗證密鑰
Sk = "xxx"
#MQ控製台創建的Producer ID
ProducerID = "xxx"
#MQ控製台創建的Consumer ID
ConsumerID = "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 ID
private static $producerid = "ProducerID";
//阿裏雲身份驗證碼
private static $aks = "AccessKey";
//配置信息
private static $configs = null;
//構造函數
function __construct()
{
//讀取配置信息
$this::$configs = parse_ini_file("config.ini");
}
//計算md5
private 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請求類型,此處為POST
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST");
//設置HTTP請求的URL
curl_setopt($ch,CURLOPT_URL,$postUrl);
//設置HTTP請求的body
curl_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 協議接收消息,請參考以下示例代碼。
<?php
include ("Util.php");
/*
* 消息訂閱者
*/
class HttpConsumer
{
//簽名
private static $signature = "Signature";
//Consumer ID
private 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請求類型,此處為GET
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"GET");
//設置HTTP請求URL
curl_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請求類型,此處為DELETE
curl_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-阿裏雲