推荐使用 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 服务器
服务器接收请求、调用方法、返回响应。核心是注册处理函数并启动服务。
立即学习“PHP免费学习笔记(深入)”;
- 定义一个处理类(如
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 就算入门成功了。











