Async RPC client over WebSocket using amphp and msgpack.
composer require php-websocket-rpc/rpc-clientRequires PHP 8.5+, ext-msgpack, and the amphp ecosystem.
use PhpWebsocketRpc\RpcClient\Client\RpcClient;
$client = RpcClient::connect('ws://127.0.0.1:9502/rpc');
// ─── Typed request/response ───
$response = $client->call(new MathDivideRequest(x: 10, y: 2))->await();
echo $response->result; // 5
// ─── Fire-and-forget notification ───
$client->notify(new LogMessage(text: 'Hello!'));
// ─── Using contract proxies ───
$math = $client->createProxy(MathService::class);
$result = $math->add(10, 5); // call/response
echo $result; // 15
$math->log('Hello!'); // notification
foreach ($math->count(10) as $value) { // streaming
echo $value;
}
$math->onEvent(function (string $event) { // subscribe
echo "Got: $event";
});
$chat->send('Hello!'); // publish- Typed RPC calls — send typed payloads, receive typed responses
- Contract proxies —
createProxy()generates a dynamic proxy from any interface usingproxy-manager-lts - 5 patterns — call/response, notification, streaming, subscribe, publish
- Fire-and-forget — notifications with no response
- Stream subscriptions — async iterables for streaming data (supports
foreach) - Publish/Subscribe — named channels with
#[RpcSubscribe]/#[RpcPublish] - Middleware — client-side middleware pipeline
- Retry support —
RetryableRpcClientwraps any client with configurable retry strategy
Define a shared interface:
interface MathService
{
public function add(int $a, int $b): int;
public function mul(int $a, int $b): int;
}Use it transparently:
$math = $client->createProxy(MathService::class);
$sum = $math->add(10, 5); // returns 15 — no boilerplateThe proxy is generated by friendsofphp/proxy-manager-lts using NullObjectFactory + AccessInterceptorValueHolderFactory — no eval() or runtime code generation.
| Class | Purpose |
|---|---|
PhpWebsocketRpc\RpcClient\Client\RpcClient |
Main client — connect, call, notify, subscribe, publish |
PhpWebsocketRpc\RpcClient\Client\ContractProxyFactory |
Generates dynamic proxies from interfaces |
PhpWebsocketRpc\RpcClient\Client\PendingRequestStore |
Tracks in-flight requests |
PhpWebsocketRpc\RpcClient\Client\SubscriptionManager |
Manages active stream subscriptions |
PhpWebsocketRpc\RpcClient\Client\RetryableRpcClient |
Client with automatic retry |
PhpWebsocketRpc\RpcClient\Transport\FramedConnection |
Low-level framed WebSocket connection |