在這一小節文章中,將通過一個PHP實現XML-RPC呼叫範例的講解,讓大家了解在PHP中,如何編寫使用XML-RPC的PHP程式。
PHP程式設計語言中整合了XML-RPC和SOAP兩種Web Service通訊兩種協定標準,基本的思想就是使用基於XML的HTTP的遠端呼叫提供一種標準的機制,而省去建立一種新協定的需求。其實這在實際開發應用中是非常實用,比如PC用戶端或者現在流行的手機用戶端需要同伺服器端通訊,這時候XML-RPC就是一個很好的解決辦法。
基本原理就是XML-RPC使用XML來進行通訊。首先構造一個RPC 伺服器端用來出來從RPC用戶端傳遞過來的使用XML封裝的請求,並且把處理結果通過XML的形式返回給RPC用戶端,用戶端就去分析XML獲取自己需要的資料。XML-RPC的伺服器端必須有現成的函式提供給用戶端呼叫,並且用戶端提交的請求中的函式和方法必須和伺服器端的一致,否則將無法獲取所需要的結果。
首先要確保您的PHP環境中有支援XML-RPC擴充套件,如果沒有可以請安裝,windows下php_xmlrpc.dll
放到PHP擴充套件目錄下,Linux重新編譯PHP,在configure
的時候加上 –with-xmlrpc
選項,如果用的是Ubuntu,所以直接 sudo apt-get install php5-xmlrpc
就可以了。這裡以Windows下的WAMP整合開發環境來執行此範例程式碼。
伺服器端程式碼如下(檔案:server.php) :
<?php
/*
* @function 提供給RPC用戶端呼叫的函式
* @param string $method 用戶端需要呼叫的函式
* @param array $params 用戶端需要呼叫的函式的引數陣列
* return string 返回撥用結果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get") {
$return = 'This data by get method';
} else {
$return = 'Not specify method or params';
}
return $return;
}
//產生XML-RPC的伺服器端
$xmlrpc_server = xmlrpc_server_create();
//註冊一個伺服器端呼叫的方法rpc_server,實際指向的是rpc_server_func函式
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
//接受用戶端POST過來的XML資料
$request = $HTTP_RAW_POST_DATA;
//執行呼叫用戶端的XML請求後獲取執行結果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);
//把函式處理後的結果XML進行輸出
header('Content-Type: text/xml');
echo $xmlrpc_response;
//銷毀XML-RPC伺服器端資源
xmlrpc_server_destroy($xmlrpc_server);
?>
用戶端程式碼,檔案:client.php -
<?php
/*
* @function 提供給用戶端進行連線XML-RPC伺服器端的函式
* @param string $host 需要連線的主機
* @param string $port 連線主機的埠
* @param string $rpc_server XML-RPC伺服器端檔案
* @param $request 封裝的XML請求資訊
* return 成功返回由伺服器端返回的XML資訊,失敗返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
//開啟指定的伺服器端
$fp = fsockopen($host, $port);
//構造需要進行通訊的XML-RPC伺服器端的查詢POST請求資訊
$query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: " . $host . "\nContent-Type: text/xml\nContent-Length: " . strlen($request) . "\n\n" . $request . "\n";
//把構造好的HTTP協定傳送給伺服器,失敗返回false
if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return false;
}
//獲取從伺服器端返回的所有資訊,包括HTTP頭和XML資訊
$contents = "";
while (!feof($fp)) {
$contents .= fgets($fp);
}
//關閉連線資源後返回獲取的內容
fclose($fp);
return $contents;
}
//構造連線RPC伺服器端的資訊
$host = 'localhost';
$port = 80;
$rpc_server = 'server.php';
//把需要傳送的XML請求進行編碼成XML,需要呼叫的方法是rpc_server,引數是get
$request = xmlrpc_encode_request('rpc_server', 'get');
//呼叫rpc_client_call函式把所有請求傳送給XML-RPC伺服器端後獲取資訊
$response = rpc_client_call($host, $port, $rpc_server, $request);
//分析從伺服器端返回的XML,去掉HTTP頭資訊,並且把XML轉為PHP能識別的字串
$split = "";
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
//輸出從RPC伺服器端獲取的資訊
print_r($response);
XML-RPC函式參考:
xmlrpc_decode_request
— 將 XML 譯碼為 PHP 本身的型別xmlrpc_decode
— 將 XML 譯碼為 PHP 本身的型別xmlrpc_encode_request
— 為 PHP 的值生成 XMLxmlrpc_encode
— 為 PHP 的值生成 XMLxmlrpc_get_type
— 為 PHP 的值獲取 xmlrpc 的型別xmlrpc_is_fault
— Determines if an array value represents an XMLRPC faultxmlrpc_parse_method_descriptions
— 將 XML 譯碼成方法描述的列表xmlrpc_server_add_introspection_data
— 新增自我描述的文件xmlrpc_server_call_method
— 解析 XML 請求同時呼叫方法xmlrpc_server_create
— 建立一個 xmlrpc 伺服器端xmlrpc_server_destroy
— 銷毀伺服器端資源xmlrpc_server_register_introspection_callback
— 註冊一個 PHP 函式用於生成文件xmlrpc_server_register_method
— 註冊一個 PHP 函式用於匹配 xmlrpc 方法名xmlrpc_set_type
— 為一個 PHP 字串值設定 xmlrpc 的型別、base64 或日期時間引數:http://www.php.net/manual/zh/book.xmlrpc.php