PHP的XML-RPC服务器和客户端怎么实现

推荐使用 phpxmlrpc 库实现 XML-RPC 服务端和客户端,需通过 Composer 安装,服务端注册方法并调用 service() 处理请求,客户端通过 Client 调用方法并解析 Response,注意类型包装与调试开关设置。

PHP 实现 XML-RPC 服务端和客户端,推荐使用 phpxmlrpc 库(官方维护、兼容 PHP 7/8、支持现代特性),而非已废弃的内置 `xmlrpc_*` 函数(PHP 8.1+ 已移除)。下面以 v4.x 版本为例,给出简洁实用的实现方式。

安装 phpxmlrpc 库

用 Composer 安装:

composer require phpxmlrpc/phpxmlrpc

确保项目已启用 Composer 自动加载(通常 require 'vendor/autoload.php' 即可)。

实现 XML-RPC 服务器

服务器接收请求、调用方法、返回响应。核心是注册处理函数并启动服务。

  • 定义一个处理类(如 MyApi),把业务逻辑写成 public 方法
  • 创建 XmlRpcServer 实例,用 addMethod() 注册方法(支持命名空间)
  • 调用 service() 处理 HTTP 请求(通常放在 server.php 中)

示例(server.php):

require 'vendor/autoload.php';
use PhpXmlRpc\Server;
use PhpXmlRpc\Request;
use PhpXmlRpc\Response;
use PhpXmlRpc\Value;

class MyApi {
    public function sayHello($params) {
        $name = $params[0]->scalarval();
        return new Response(new Value("Hello, {$name}!"));
    }

    public function add($params) {
        $a = $params[0]->scalarval();
        $b = $params[1]->scalarval();
        return new Response(new Value($a + $b));
    }
}

$server = new Server();
$server->addMethod('myapi.sayHello', [new MyApi(), 'sayHello']);
$server->addMethod('myapi.add',      [new MyApi(), 'add']);

$server->service(); // 响应 POST 请求

实现 XML-RPC 客户端

客户端构造请求、发送、解析响应。关键在 Client 类和 call() 方法。

  • 初始化 Client,传入服务端 URL(如 http://localhost/server.php
  • new Value() 包装参数(支持 int/string/array/struct 等类型)
  • call() 返回 Response 对象,用 value() 提取结果

示例(client.php):

require 'vendor/autoload.php';
use PhpXmlRpc\Client;
use PhpXmlRpc\Value;

$client = new Client('http://localhost/server.php');

// 调用 sayHello
$response = $client->call('myapi.sayHello', [new Value('Alice')]);
if ($response->isFault()) {
    echo "Error: " . $response->faultString();
} else {
    echo $response->value()->scalarval(); // 输出:Hello, Alice!
}

// 调用 add
$response = $client->call('myapi.add', [new Value(3), new Value(5)]);
echo $response->value()->scalarval(); // 输出:8

注意事项与调试技巧

XML-RPC 类型严格,PHP 数组需明确区分 array(映射为 struct)和 list(映射为 array);调试时可开启日志:

  • 服务端加 $server->setDebug(2) 查看收发的 XML
  • 客户端设 $client->setDebug(2) 输出原始请求/响应
  • 避免直接传 PHP 资源、闭包或对象(不支持序列化)
  • HTTP 层建议用标准 POST,Content-Type 必须为 text/xml

基本上就这些。不复杂但容易忽略类型包装和调试开关——跑通第一个 sayHello 就算入门成功了。