thinkphp6如何使用swoole服务

  • Post author:
  • Post category:php


安装thinkphp6

composer create-project topthink/think=6.0.x-dev tp

安装think-swoole的扩展库

composer require topthink/think-swoole

注:think-swoole安装很困难,需要先给PHP安装swoole扩展,然后删除PHP禁用的函数(具体那些禁用的函数需要删除,安装会报错,报错里有提示有删除那些禁用的函数),最后安装网速特别慢可能导致安装不上,建议在香港服务器上安装。

修改conflg文件夹下的swoole.php文件下的配置参数

['host']=>'0.0.0.0'
['port']=>'9502'//这是端口,可自行决定用哪个端口。

在swoole.php文件中引入文件

use app\websocket\privater\Handler;
use app\websocket\privater\Packet;

修改参数

'handler'       => Handler::class,
'parser'        => Parser::class,

Handler.php文件源码如下

<?php
namespace app\websocket\privater;

use Swoole\Server;
use Swoole\Websocket\Frame;
use Swoole\WebSocket\Server as WebsocketServer;
use think\Config;
use think\Request;
use think\swoole\contract\websocket\HandlerInterface;

//Handler全部返回false,将逻辑全部交给WebsocketEvent处理
class Handler implements HandlerInterface
{
    /** @var WebsocketServer */
    protected $server;

    /** @var Config */
    protected $config;


    public function __construct(Server $server, Config $config)
    {
        $this->server = $server;
        $this->config = $config;
    }

    /**
     * "onOpen" listener.
     *
     * @param int $fd
     * @param Request $request
     */
    public function onOpen($fd, Request $request)
    {
        //交给Connect监听处理
        return false;
    }

    /**
     * "onMessage" listener.
     *  only triggered when event handler not found/返回false触发监听,返回true直接完成
     *
     * @param Frame $frame
     * @return bool
     */
    public function onMessage(Frame $frame)
    {
        //返回false触发全局监听
        return false;
    }

    /**
     * "onClose" listener.
     *
     * @param int $fd
     * @param int $reactorId
     */
    public function onClose($fd, $reactorId)
    {
        return false;
    }
}

Parser.php文件源码如下

<?php
namespace app\websocket\privater;

use think\swoole\contract\websocket\ParserInterface;

class Parser implements ParserInterface
{

    /**
     * Encode output payload for websocket push.
     *
     * @param string $event
     * @param mixed $data
     *
     * @return mixed
     */
    public function encode(string $event, $data)
    {
        return json_encode(['event' => $event, 'data' => $data], 320);
    }

    /**
     * Decode message from websocket client.
     * Define and return payload here.
     *
     * @param \Swoole\Websocket\Frame $frame
     *
     * @return array
     */
    public function decode($frame)
    {
        $payload = Packet::getPayload($frame->data);
        return [
            'event' => $payload['event'] ?? null,
            'data' => $payload['data'] ?? null,
        ];
    }
}

1.Handler.php用于websocket事件的响应,如open/message等.必要文件

2.Parser .php用于消息体的解析,这里使用的格式为json,若换成其他通讯格式只要下对encode/decode编解码方法重写即可.必要文件

配置完成了

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

php think swoole start

执行如下命令重启swoole

php think swoole restart

执行如下命令停止swoole

php think swoole stop

到这里,swoole的配置,启动,重新,停止。就写完了,具体的项目需求还需要你自己在Handler.php文件里修改项目需求。



版权声明:本文为weixin_46704937原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。