php搭建swooleTCP服务器
这次的swoole学习,比较缓慢
也由于这些几天事比较多,晚上没去学习,swoole的笔记也一直在没编写,下面简单介绍和应用下swoole
swoole是什么?
- 异步、并行、高性能
- 纯C编写
- php扩展
swoole能做什么?
- 异步多线程服务器及客户端
- 异步MySQL、Reids、数据库连接池、任务队列
- http/websocket服务器/客户端
- 异步文件读写
- Swoole2.0支持协程
Swolle 实践
swoole手册:https://wiki.swoole.com/wiki/page/1.html
服务器版本:centos7/ubuntu16
php版本:5.4+
一、swoole安装(百度上有很多安装文章,也可以用宝塔直接安装)
二、简单TCP服务器创建
<?php
/**@创建TCP服务器 * 作者:生生 */ $host = '127.0.0.1'; //监听对应外网的IP 0.0.0.0监听所有ip $port = 9501; //端口号(1024以下端口需要root权限) $mode = SWOOLE_PROCESS; //SWOOLE_PROCESS 进程模式-多进程方式 $socke_type = SWOOLE_SOCK_TCP; //SWOOLE_SOCK_TCP 服务器类型-默认TCP $serv = new swoole_server($host,$port); //后面2参数不写是默认 /**@ * 函数:bool $swoole_server->on(string $event,miexd $callback); * $event * connect:当建立链接的时候 (2个默认参数:$serv-服务器信息,$fd-客户信息 /-名字随意) * receive:当接收数据的时候 (4个默认参数:$serv-同上,$fd-同上,$from_id-客户id,$data-传递数据) * close:关闭链接 */ //@作用:监听链接进入事件 $serv->on('connect',function($serv,$fd){ echo '链接成功'; }); //@作用:监听数据接收事件 $serv->on('receive',function($serv,$fd,$from_id,$data){
var_dump($fd.'--'.$data);
/**@ * 函数:bool Server->send(mixed $fd, string $data, int $serverSocket = -1); * 作用:向客户端发送数据 * 参数: * $fd,客户端的文件描述符 * $data,发送的数据,TCP协议最大不得超过2M,可修改 buffer_output_size 改变允许发送的最大包长度 * $serverSocket,向Unix Socket DGRAM对端发送数据时需要此项参数,TCP客户端不需要填写 */ $serv->send($fd,"数据:".$data); }); //@作用:监听链接关闭事件 $serv->on('close',function($ser,$fd){ echo '关闭链接'; }); //启动服务 $serv->start();
三、运行上面php文件
1、浏览器直接访问会提示:Fatal error: Swoole\Server::__construct(): swoole_server only can be used in PHP CLI mode. in /www/jzj/public/aa.php on line 7
这个文件需要用php CLI模式(php命令行模式运行: php -f 运行文件名.php)
2、如果命令行运行的时候出现这个错误说明,端口被占用,
查看被占用的端口PID:sudo lsof -i:9501
kill掉进程:sudo kill -9 PID(在运行 php -f 运行文件名.php)
四、创建TCP同步客户端(TP5举例)
<?php namespace app\admin\controller; use think\Controller; use think\Db; use Redis; use swoole_client; class Index extends controller {
//客户端swoole public function swoole() { $client = new swoole_client(SWOOLE_SOCK_TCP); //连接到服务器 if (!$client->connect('127.0.0.1', 9501, 0.5)) { die("connect failed."); } //向服务器发送数据 if (!$client->send("hello world")) { echo '发送失败'; } //从服务器接收数据 $data = $client->recv(); if (!$data) { die("recv failed."); } echo $data; //关闭连接 $client->close(); } }
注意客户端服务器在框架中要引入
把这个文件上传到服务器项目中,浏览器访问这个后如果报错如下:是因为服务端没有send发送数据出来问题
服务端会出现send为空,要注意很可能是$serv->on中的第一个参数不对,
如图:这个参数一定要是对应的new的对象
在重新运行文件:命令行会出现这个,
这样就完成了简单的tcp服务器与同步tcp客户端的搭建,当tcp服务器文件运行完成后删除也不影响(建议保留)
简单流程是:编写TCP服务器文件->运行服务器文件->TCP服务器创建成功->创建TCP客户端文件->运行与服务端(向服务端发送数据并接受服务端返回信息)
当然这篇只是简单的搭建与了解swoole,后续还会更新简单的swoole的php异步操作与实时聊天功能
本人也是新手,swoole是很强大的扩展,里面包含很多知识我也在学习中
想要探讨swoole或者其他问题可以关注博客园:传说中的生生或+Q:876036823一起交流
-----生生的笔记