首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 構建 XML-RPC 遠程服務實戰(下):服務端開發與完整應用範例

     編輯:PHP 綜合知識

服務端核心:xmlrpc_server

建立服務對應表,將方法名稱映射到 PHP 函數(方法處理器):

<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");

function foo($params) {
    global $xmlrpcerruser;
    // $params 為 xmlrpcval 陣列
    $vala = $params->params[0];        // 取第一個參數
    $sval = $vala->scalarval();        // 轉標量
    $ret = $sval * 2;                  // 業務邏輯:乘 2
    return new xmlrpcresp(new xmlrpcval($ret, "int"));
}

// 註冊:methodName "product" 對應 function "foo"
$s = new xmlrpc_server(array(
    "product" => array("function" => "foo")
));
?>

方法處理器撰寫規範

  • 參數:$params 為 xmlrpcval 物件陣列
  • 成功:回傳 new xmlrpcresp(new xmlrpcval($result, $type))
  • 失敗:回傳 new xmlrpcresp(0, $xmlrpcerruser+1, "錯誤訊息")
  • 型別字串:"int", "boolean", "string", "double", "dateTime.iso8601", "base64", "array", "struct"

完整應用範例:數值乘二服務

服務端 servfoo.php

<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");

function foo($params) {
    global $xmlrpcerruser;
    $vala = $params->params[0];
    $sval = $vala->scalarval();
    $ret = $sval * 2;
    return new xmlrpcresp(new xmlrpcval($ret, "int"));
}

$s = new xmlrpc_server(array(
    "product" => array("function" => "foo")
));
?>

客戶端 client.php

<?php
include("xmlrpc.inc");

if ($HTTP_POST_VARS["number"] != "") {
    $f = new xmlrpcmsg('product', array(new xmlrpcval($HTTP_POST_VARS["number"], "int")));
    $c = new xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia.com.ar", 80);
    $c->setDebug(0);
    $r = $c->send($f);
    $v = $r->value();

    if (!$r->faultCode()) {
        print "Number " . $HTTP_POST_VARS["number"] . " is " . $v->scalarval() . "<BR>";
        print "<HR>伺服器結果<BR><PRE>" . htmlentities($r->serialize()) . "</PRE><HR>";
    } else {
        print "操作失敗: 代碼 " . $r->faultCode() . " 原因: '" . $r->faultString() . "'<BR>";
    }
}

print "<FORM METHOD='POST'>
<INPUT NAME='number' VALUE='${number}'>
<INPUT TYPE='SUBMIT' VALUE='go' NAME='submit'></FORM><P>
輸入一個數值";
?>

部署與測試

  1. 將 servfoo.php 放入 Web 根目錄 /xmlrpc/
  2. 確保 Web Server 支援 PHP,且 xmlrpc.inc/xmlrpcs.inc 在 include_path
  3. 瀏覽 client.php,輸入數字送出,觀察結果
  4. 除錯:$c->setDebug(1) 可看原始 HTTP 往返

進階主題與生產環境考量

  • 服務發現:UDDI 嘗試解決,但複雜度高,業界採用率低。內部可用註冊中心或配置中心
  • 安全性:XML-RPC 本身無認證授權,需自行在 HTTP 層(Basic Auth、Token)或應用層實作
  • 效能:XML 解析開銷大,高頻調用考慮 JSON-RPC、gRPC、Thrift
  • 錯誤處理:統一 faultCode 規範,記錄完整請求/回應便於追蹤
  • 版本演進:新增參數預設值、避免破壞相容性

結語

XML-RPC 以簡單、標準、跨語言特性,成為早期 Web 服務基石。雖現代架構多轉向 REST/JSON 或 gRPC,但理解 XML-RPC 有助於掌握分布式服務核心概念:契約優先、序列化、傳輸解耦、異構互通。許多企業內部系統仍在穩定運行,維護技能依具價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved