php中rpc需借助第三方库实现,核心是封装远程调用细节;推荐Hyperf RPC或goaPHP,laravel项目可用laravel-rpc;需定义统一接口契约、启动服务端并注册方法、客户端通过代理类调用,注意超时、重试与服务发现。

PHP 中 RPC 框架不是 PHP 原生内置的,需要借助第三方库或自建通信机制来实现远程过程调用。核心思路是:把本地函数调用“伪装”成对远端服务的调用,框架负责序列化参数、网络传输、反序列化响应、错误处理等细节。
选一个轻量易上手的 RPC 框架
推荐从 Hyperf RPC 或 GoaPHP(基于 swoole) 入手,它们对 PHP 开发者友好,文档较全,且支持协程提升并发能力。如果项目已用 Laravel,可考虑 Laravel RPC(如 laravel-rpc 包),它通过 Artisan 命令生成客户端/服务端 stub,集成较顺滑。
- Hyperf 默认使用 jsON-RPC over http 或 TCP,也支持 gRPC(需额外扩展)
- 纯传统 PHP-FPM 项目可用 xml-RPC(内置 ext/xmlrpc)或 json-RPC 2.0(用 php–jsonrpc 库)
- 不建议从零手写 socket + 序列化,容易出错且难维护
定义接口与服务契约
RPC 强依赖清晰的接口约定。通常先写一个 interface(如 UserServiceInterface),声明方法签名(参数类型、返回类型),服务端和客户端共用同一份契约代码或生成对应 stub。
- 例如:
public function getUserById(int $id): Array; - Hyperf 中可通过注解
@RpcService(name="UserService", protocol="jsonrpc-http")绑定实现类 - gRPC 场景下需先写 .proto 文件,再用 protoc 生成 PHP 类
启动服务端并注册方法
以 Hyperf 为例,新建一个 Service 类,实现接口,并打上 RPC 注解;然后在配置中开启 RPC Server(如 jsonrpc-http 监听 9504 端口)。
MixPHP 是一个 PHP 命令行模式开发框架;基于 Vega 驱动的 HTTP 可以同时支持 Swoole、WorkerMan、FPM、CLI-Server 生态,并且可以无缝切换;V3 是一个高度解耦的版本,整体代码基于多个独立的模块构建,即便用户不使用我们的脚手架,也可以使用这些独立模块,并且全部模块都支持原生开发。例如:你可以只使用 mix/vega 来搭配 laravel orm 使用
12 立即学习“PHP免费学习笔记(深入)”;
- 确保服务端能被客户端网络访问(注意防火墙、docker 网络、域名解析)
- 启用服务发现(如 consul / etcd)可让客户端自动找到服务实例,适合多节点部署
- 简单测试可用 curl 直接发 JSON-RPC 请求:
curl -X POST http://127.0.0.1:9504 -d '{"jsonrpc":"2.0","method":"UserService::getUserById","params":[1],"id":1}'
客户端调用就像调本地函数
客户端引入相同接口,通过框架提供的代理类(proxy)或客户端实例调用。框架在背后完成编码、发请求、收响应、解码全过程。
- Hyperf 中注入
UserInterface即可直接调用$this->userInterface->getUserById(1) - 若用纯 Guzzle 手动调,需自己拼 JSON-RPC 请求体、处理 id 匹配、异常状态码,不推荐
- 记得加超时和重试(Hyperf 默认支持
@CircuitBreaker和@Retry注解)
基本上就这些。关键不是“怎么装包”,而是理清服务拆分边界、统一接口定义、做好错误透传和链路追踪。RPC 在 PHP 中不复杂,但容易忽略序列化兼容性、版本升级、超时设置这些细节。