swoole实现简单的rpc调用

介绍

rpc 翻译过来就是远程过程调用,其实现形式有 restful api形式调用和 tcp 形式的调用。当然就性能来说,肯定是 tcp 形式的调用性能更高一些。

这里以一个 tcp 来简要讲述 rpc 的实现过程。

目录结构
│  Client.php 		// 客户端
│  composer.json	// 主要为了自动加载
│  Server.php		// 服务端
│
├─Service			// 存放各种服务的文件夹
│      CartService.php // 具体的服务类
│
└─vendor
    │  autoload.php

基本原理

rpc 使用 tcp 调用的基本原理就是将需要调用的服务类,和要调用的类中的方法,在 tcp 参数中传过来,然后在服务端解析参数,调用指定类中的方法。

演示

Client.php

<?php


namespace rpc;


class Client
{
    protected $service;

    public function __call($name, $arguments)
    {
        if ($name == 'service') {
            $this->service = $arguments[0];
            return $this;
        }
        $json_data = json_encode([
            'service' => $this->service,
            'action' => $name,
            'param' => $arguments[0],
        ]);
        $client = new \Swoole\Client(SWOOLE_SOCK_TCP);
        if (!$client->connect('127.0.0.1', 9501, -1)) {
            exit("connect failed. Error: {$client->errCode}\n");
        }
        $client->send($json_data);
        $result = $client->recv();
        var_dump($result);
        $client->close();
    }
}

$client = new Client();
$client->service('CartService')->getList(1);

Server.php

<?php
require_once 'vendor/autoload.php';

class Server
{
    protected $server;

    public function __construct()
    {
        $this->server = new \Swoole\Server("127.0.0.1", 9501);
        $this->onConnect();
        $this->onReceive();
        $this->onClose();
        $this->start();;
    }

    public function onConnect()
    {
        $this->server->on('Connect', function ($serv, $fd) {
            echo "Client: Connect.\n";
        });
    }

    public function onReceive()
    {
        $this->server->on('Receive', function ($serv, $fd, $from_id, $data) {
            $data = json_decode($data, true);
            $service = $data['service'];
            $action = $data['action'];
            $page = $data['param'];
            $class = "rpc\\Service\\" . $service;
            $instance = new $class;
            $result = json_encode($instance->$action($page));
            $serv->send($fd, $result);
        });
    }

    public function onClose()
    {
        $this->server->on('Close', function ($serv, $fd) {
            echo "Client: Close.\n";
        });
    }

    public function start()
    {
        $this->server->start();
    }
}

$server = new Server();

CartService.php

<?php


namespace rpc\Service;


class CartService
{
    public function getList($page)
    {
        return [
            [
                'name' => 'zhangsan',
                'sex' => $page,
            ],
            [
                'name' => 'lisi',
                'sex' => 0,
            ]
        ];
    }
}

composer.json(主要声明一下自动加载规则)

{
    "name": "gift/rpc",
    "authors": [
        {
            "name": "gift",
            "email": "853183966@qq.com"
        }
    ],
    "require": {},
    "autoload": {
        "psr-4": {
            "rpc\\": ""
        }
    }
}
执行结果

启动服务端后,我们再执行客户端,就会收到以下的返回内容:

string(53) "[{"name":"zhangsan","sex":1},{"name":"lisi","sex":0}]"

demo下载链接:https://github.com/zhang-jianqiang/rpcdemo

好的,我了解你的问题。对于使用 ThinkPHP 框架和 Swoole 扩展实现聊天的问题,具体的思路如下: 1. 安装 Swoole 扩展:可以通过编译源码或者安装扩展包的方式进行安装。建议使用 PECL 方式安装,可以通过以下命令安装: ```sh pecl install swoole ``` 2. 创建 Swoole 服务器:在 ThinkPHP 中,可以通过创建一个 Swoole 服务器的任务来实现聊天功能。具体来说,可以在 `application/command` 目录下创建一个 `ChatServer.php` 文件,然后在该文件中编写 Swoole 服务器的逻辑。 3. 实现 WebSocket 协议:由于聊天功能需要使用 WebSocket 协议,因此需要在 Swoole 服务器中实现相应的逻辑。可以使用 Swoole 提供的 `WebSocket\Server` 类来实现 WebSocket 服务器。 4. 处理客户端请求:在 Swoole 服务器中,可以通过注册回调函数来处理客户端的请求。可以在 `onMessage` 回调函数中接收客户端发送的消息,并将消息广播给所有的客户端。 5. 实现聊天室功能:可以使用 Swoole 提供的 `Table` 类来实现聊天室功能。可以在 `onOpen` 回调函数中为每个客户端分配一个唯一的 ID,并将其与对应的 WebSocket 连接关联起来。然后在 `onMessage` 回调函数中,可以将客户端发送的消息存储到 `Table` 中,并在 `onMessage` 回调函数中广播消息给所有的客户端。 以上就是使用 ThinkPHP 和 Swoole 实现聊天功能的基本思路。具体的实现细节可以根据需求进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值