RPC 远程过程调用(Remote Procedure Call,简称 RPC)是一种允许一台服务器上的应用程序(例如服务器 A)通过网络调用另一台服务器(例如服务器 B)上的函数或方法的通信机制。由于两台服务器的应用程序不在同一内存空间,无法直接调用彼此的函数,RPC 通过网络传输调用语义和数据,实现了类似本地调用的体验。
tinywan/rpc
插件专为 Webman 框架开发,利用 Webman 的高性能异步特性,提供了一个轻量、快速的 RPC 解决方案。它简化了远程服务调用的复杂性,非常适合用于微服务架构、实时应用或物联网系统等场景。
通过 Composer 安装非常简单。在项目目录下运行以下命令:
composer require tinywan/rpc
此命令会将 tinywan/rpc
包下载并集成到你的 Webman 项目中。请确保你的环境满足 Webman 的运行要求。
RPC 插件允许开发者在服务器端定义服务,并在客户端通过网络调用这些服务。以下是实现基本 RPC 服务的步骤。
在 service
目录下创建服务类文件,例如 service/User.php
:
namespace service;
class User
{
public function get($args)
{
return response_rpc_json(0, '获取成功', $args);
}
}
这段代码定义了一个 User
服务类,包含一个 get
方法,接收参数并返回 JSON 格式的响应,包含状态码(0
表示成功)、消息(获取成功
)和传入的参数。
在客户端,可以通过 TCP 套接字连接到服务器并调用远程方法。以下是一个调用 User
服务 get
方法的示例:
// 建立与服务器 RPC 端口的套接字连接
$client = stream_socket_client('tcp://127.0.0.1:9512', $errorCode, $errorMessage);
if (false === $client) {
throw new \Exception('rpc 连接失败: ' . $errorMessage);
}
// 准备请求数据
$request = [
'class' => 'user',
'method' => 'get',
'args' => [
[
'uid' => 2023,
'username' => 'Tinywan',
]
]
];
// 发送请求(Text 协议要求数据末尾加换行符)
fwrite($client, json_encode($request) . "\n");
// 读取响应
$result = fgets($client, 10240000);
// 解析 JSON 响应
$result = json_decode($result, true);
var_export($result);
成功请求的响应如下:
{
"code": 0,
"msg": "用户列表",
"data": {
"uid": 2025,
"username": "Tinywan"
}
}
如果调用失败,例如调用不存在的类,会返回类似以下的错误响应:
{
"code": 404,
"msg": "接口调用类不存在",
"data": {}
}
插件提供详细的错误日志,便于调试。例如,数据库相关的错误可能生成如下日志:
[2025-08-16 14:46:26] default.ERROR:
RPC Service Exception Message SQLSTATE[42S22]:
Column not found: 1054 Unknown column 'to_user_id' in 'where clause'
{"error":"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'to_user_id' in 'where clause'",
"file":"/var/www/db/PDOConnection.php","line":797} []
该日志表明数据库查询中缺少 to_user_id
列,开发者可根据此信息快速定位并解决问题。