1、新建文件 process/Rpc.php 编写rpc进程
<?php namespace process; use Workerman\Connection\TcpConnection; class Rpc { public function onMessage(TcpConnection $connection, $data) { static $instances = []; $data = json_decode($data, true); $class = 'service\\' . $data['class']; $method = $data['method']; $args = $data['args']; if (!isset($instances[$class])) { $instances[$class] = new $class; // 缓存类实例,避免重复初始化 } $connection->send(call_user_func_array([$instances[$class], $method], $args)); } }
2、打开 config/process.php 增加配置启动rpc进程
return [ // ... 这里省略了其它配置... 'rpc' => [ 'handler' => process\Rpc::class, 'listen' => 'text://0.0.0.0:8888', // 这里用了text协议,也可以用frame或其它协议 'count' => 8, // 可以设置多进程 ] ];
3、新建 service/User.php 服务 (目录不存在自行创建)
<?php namespace service; class User { public function get($uid) { return json_encode([ 'uid' => $uid, 'name' => 'tom' ]); } }
4、重启webman php start.php restart
5、客户端调用
<?php $client = stream_socket_client('tcp://127.0.0.1:8888'); $request = [ 'class' => 'User', 'method' => 'get', 'args' => [100], // 100 是 $uid ]; fwrite($client, json_encode($request) . "\n"); // text协议末尾有个换行符"\n" $result = fgets($client, 10240000); $result = json_decode($result, true); var_export($result);
以上客户端代码自己可以封装成一个类
最终结果打印
array ( 'uid' => 100, 'name' => 'tom', )