Web Service 通訊協定主流有 XML-RPC 與 SOAP 兩種。XML-RPC 結構簡單、歷史悠久,適合輕量級遠程呼叫;SOAP 功能豐富但複雜,適合企業級嚴謹整合。PHP 內建 xmlrpc 擴展,PEAR 也提供純 PHP 實作。本文以 XML-RPC 為例,示範完整的 Server/Client 互動流程。
php_xmlrpc.dll 放入系統目錄,php.ini 啟用 extension=php_xmlrpc.dll,重啟 Web Server--with-xmlrpc 參數phpinfo() 出現 XML-RPC 區塊即成功<?php
// 提供給 Client 呼叫的函數
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 Server
$xmlrpc_server = xmlrpc_server_create();
// 註冊方法:對外名稱 rpc_server -> 實際函數 rpc_server_func
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
// 接收 Client 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;
// 釋放資源
xmlrpc_server_destroy($xmlrpc_server);
?>
<?php
// Socket 連線並發送 XML 請求
function rpc_client_call($host, $port, $rpc_server, $request) {
$fp = fsockopen($host, $port);
$query = "POST $rpc_server HTTP/1.0\r\n"
. "User_Agent: XML-RPC Client\r\n"
. "Host: $host\r\n"
. "Content-Type: text/xml\r\n"
. "Content-Length: " . strlen($request) . "\r\n\r\n"
. $request . "\r\n";
if (!fputs($fp, $query, strlen($query))) { return false; }
$contents = '';
while (!feof($fp)) { $contents .= fgets($fp); }
fclose($fp);
return $contents;
}
// 組裝請求參數
$host = 'localhost';
$port = 80;
$rpc_server = '/~heiyeluren/rpc_server.php';
// 編碼:呼叫 rpc_server 方法,參數為 'get'
$request = xmlrpc_encode_request('rpc_server', 'get');
// 發送請求並取得回應
$response = rpc_client_call($host, $port, $rpc_server, $request);
// 移除 HTTP Header,解碼 XML 為 PHP 變數
$xml = substr($response, strpos($response, '
實際傳輸的 XML 範例
This data by get method
進階建議
xmlrpc_encode_request() 自動處理陣列/物件序列化xmlrpc 擴展,可改用 PEAR::XML_RPC 純 PHP 實作XML-RPC 雖輕量,但缺乏標準化的服務描述(如 WSDL),適用於內部系統輕量整合;對外開放 API 建議改用 REST + JSON 或 gRPC。