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',
)


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

分享到
  • QQ好友
  • 微信好友
  • 新浪微博