xcznb 2020-04-16
类Swoole\Coroutine\Server是完全协程化实现的,不需要设置事件回调函数。建立连接、接收数据、发送数据、关闭连接都是顺序的,没有异步风格的并发问题;
可以动态的开启关闭服务,异步风格的服务在 start()
被调用之后就什么也干不了了,而协程风格的可以动态开启关闭服务。但同时,协程风格的服务不会自动创建多个进程,需要配合 Process\Pool 模块使用才能利用多核。协程风格服务其实是对 Co\Socket 模块的封装,所以用协程风格的需要对 socket 编程有一定经验。目前封装层级没有异步风格服务器那么高,有些东西需要自己手动实现,比如 reload
功能需要自己监听信号来做逻辑。
一般来说,服务端按new--set--on--start步骤进行。
构造函数(对应着new一个server对象):
/** * string $host 监听的地址 默认值:无 * int $port 监听的端口【如果为 0 将由操作系统随机分配一个端口】 默认值:无 * bool $ssl 是否开启 SSL 加密 默认值:false * bool $reuse_port 是否开启端口重用,效果和此节的配置一样 默认值:false 版本影响:Swoole >= v4.4.4 */ Swoole\Coroutine\Server->__construct(string $host, int $port = 0, bool $ssl = false, bool $reuse_port);
set():参数 $options
必须为一维的关联索引数组,与 setprotocol 方法接受的配置项完全一致。必须在start()前设置
Swoole\Coroutine\Server->set(array $options);
……
demo:
<?php $serv = new swoole_server("127.0.0.1", 9501); $serv->set([ ‘worker_num‘ => 8, //worker进程数 cpu的1-4倍 ‘max_request‘ => 10000, ]); //fd 客户端连接的唯一标识 //reactor_id 线程ID $serv->on(‘connect‘, function($serv, $fd, $reactor_id){ echo "Client: {$reactor_id}-{$fd}-Connect.\n"; }); $serv->on(‘receive‘, function($serv, $fd, $reactor_id, $data){ $serv->send($fd, ‘Server: ‘.$reactor_id.‘-‘.$fd.‘ ‘.$data); }); $serv->on(‘close‘, function($serv, $fd){ echo "Client: close.\n"; }); $serv->start(); ?>
执行demo,新开窗口监听服务,发送信息;关闭服务
以上,就是swoole中tcp服务器的一个大致流程,更多的参数和方法转到官网文档:https://wiki.swoole.com/#/server/tcp_init
<?php // 连接 swoole tcp 服务 $client = new swoole_client(SWOOLE_SOCK_TCP); if(!$client->connect("127.0.0.1", 9501)) { echo "连接失败"; exit; } // php cli常量 fwrite(STDOUT, "请输入消息:"); $msg = trim(fgets(STDIN)); // 发送消息给 tcp server服务器 $client->send($msg); // 接受来自server 的数据 $result = $client->recv(); echo $result;