PHP中整合了XML-RPC和SOAP兩種Web Service通訊兩種協議標準,基本的思想就是使用基於XML的HTTP的遠程調用提供一種標準的機制,而省去建立一種新協議的需求。其實這在實際開發應用中是非常實用,比如PC用戶端或者現在流行的手機用戶端需要同伺服器端通訊,這時候XML-RPC就是一個很好的解決辦法。
這裡記一下的PHP中如何使用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就可以了。
伺服器段代碼如下,注釋詳細:
/* server.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* @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協議發送給伺服器,失敗返回falseif (!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);
通過過xmlrpc_decode函數把這個XML編碼為PHP的字串以便處理,整個Web Service互動完成。
XML-RPC函數參考:
xmlrpc_decode_request — 將 XML 解碼為 PHP 本身的類型
xmlrpc_decode — 將 XML 解碼為 PHP 本身的類型
xmlrpc_encode_request — 為 PHP 的值產生 XML
xmlrpc_encode — 為 PHP 的值產生 XML
xmlrpc_get_type — 為 PHP 的值擷取 xmlrpc 的類型
xmlrpc_is_fault — Determines if an array value represents an XMLRPC fault
xmlrpc_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 或日期時間
以上就介紹了PHP中XML-RPC使用筆記,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。