avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 think-swoole4.0通过监听端口自定义rpc服务 
文章

think-swoole4.0通过监听端口自定义rpc服务 

发表于 2026-06-14 更新于 2026-06- 14
作者 mdo
8~10 分钟 阅读

在 think-swoole 4.0(基于 ThinkPHP 6.0)中实现自定义 RPC 服务,最优雅的方式是使用 Swoole 的 多端口监听(Server::addlistener) 功能。通过自定义服务类,你可以在同一个主进程中独立处理 RPC 请求。

以下是具体的实现步骤与代码示例:

第一步:创建自定义 Swoole 服务类

继承 think\swoole\Server 并重写 onWorkerStart 与自定义的 RPC 逻辑。

创建文件 app/swoole/RpcServer.php:

php

namespace app\swoole;

use think\swoole\Server;
use Swoole\Server as SwooleServer;

class RpcServer extends Server
{
    /**
     * 重写父类方法,增加端口监听
     * @param SwooleServer $server
     */
    public function onWorkerStart(SwooleServer $server, int $workerId)
    {
        // 监听额外的 9502 端口用于 RPC 服务,协议为 TCP
        $rpcPort = $server->addlistener('0.0.0.0', 9502, SWOOLE_SOCK_TCP);
        
        // 可选:设置 RPC 端口的协议,如 EOF 边界检测或 JSON 解析
        $rpcPort->set([
            'open_length_check'     => true,
            'package_length_type'   => 'N',
            'package_length_offset' => 0,
            'package_body_offset'   => 4,
            'package_max_length'    => 2097152,
        ]);

        // 绑定 RPC 端口的数据接收事件
        $rpcPort->on('receive', function (SwooleServer $server, $fd, $reactorId, $data) {
            $this->handleRpc($server, $fd, $data);
        });

        // 调用父类的 onWorkerStart 保证其他常规业务(如HTTP/Websocket)正常启动
        parent::onWorkerStart($server, $workerId);
    }

    /**
     * 处理 RPC 请求逻辑
     */
    protected function handleRpc(SwooleServer $server, $fd, $data)
    {
        // 1. 解析客户端传来的数据(假设为 JSON 格式)
        $req = json_decode($data, true);
        $method = $req['method'] ?? '';
        $params = $req['params'] ?? [];

        // 2. 路由处理并调用对应逻辑
        $result = $this->dispatch($method, $params);

        // 3. 返回结果给客户端
        $server->send($fd, json_encode($result));
        
        // 4. 短连接处理,处理完关闭连接
        $server->close($fd);
    }

    /**
     * 简单的服务分发逻辑
     */
    protected function dispatch($method, $params)
    {
        // 示例:模拟用户服务
        if ($method === 'getUser') {
            $userId = $params['id'] ?? 0;
            return [
                'code' => 200,
                'message' => 'Success',
                'data' => ['id' => $userId, 'name' => 'ThinkSwoole']
            ];
        }

        return ['code' => 404, 'message' => 'Method Not Found'];
    }
}

请谨慎使用此类代码。

第二步:修改配置文件

修改 config/swoole.php,将 server 指向你刚刚创建的自定义类:

php

return [
    // 将此处替换为你自定义的服务类
    'server'      => '\app\swoole\RpcServer',
    
    // 主服务器监听端口(通常处理 HTTP/WebSocket)
    'host'        => '0.0.0.0',
    'port'        => 80,
    
    // ... 其他配置保持不变 ...
];

请谨慎使用此类代码。

第三步:启动服务

在项目根目录执行以下命令启动 Swoole:

bash

php think swoole

请谨慎使用此类代码。

启动后,主服务会监听默认端口,同时会在内部监听 9502 端口等待 RPC 客户端请求。

第四步:RPC 客户端调用示例

你可以使用任意客户端(如普通的 PHP 脚本、Go 等其他语言)通过 TCP 连接发送 JSON 数据进行测试:

php

// 简单的 PHP 客户端测试脚本
$client = new \Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9502, 0.5)) {
    die("connect failed. Error: {$client->errCode}\n");
}

// 发送 RPC 调用请求
$req = [
    'method' => 'getUser',
    'params' => ['id' => 1001]
];
$client->send(json_encode($req));

// 接收返回数据
echo $client->recv();

$client->close();

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

think-swoole 4.0和3.0版本区别

上一篇

RpcService.php receive 没有收到数据

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。