这次的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服务器创建
/**@创建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举例)
//客户端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一起交流
-----生生的笔记