一 .Swoole概念: 面向生产环境的 PHP 异步 网络通信引擎
1. 它本身是一个PHP的C扩展.可用来开发PHP的高性能高并发TCP/UDP Server。
2. Swoole的网络IO部分基于epoll/kqueue事件循环,是全异步非阻塞的。
3. 业务逻辑部分使用多进程同步阻塞方式来运行。这样既保证了Server能够应对高并发和大量TCP连接。又保证业务代码仍然可以简单的编写。
4. Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数。
而Swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后底层会自动回调指定的PHP函数.
二. Swoole特点:
1. 由于是纯C编写性能极强 2. 简单易用开发效率高 3. 事件驱动异步非阻塞 4. 并发百万TCP连接 5. TCP/UDP/UnixSock
6. 服务器端/客户端 7. 全异步/半异步半同步 8. 支持多进程/多线程 9. CPU亲和性/守护进程 10. 支持IPv4/IPv6网络
三. Swoole初体验及问题:
注意:
server只能用于php-cli环境,在其他环境下会抛出致命错误 ( *php-cli环境即命令行运行)
例如写入server.php文件,只能使用 php server.php 来运行,不可以到浏览器访问.
如果在浏览器中访问 server.php 文件,则会提示致命错误 :
Fatal error: Uncaught Swoole\Exception: Swoole\Server can only be used in CLI mode in /www/wwwroot/swoole/server.php
ok接下来编写代码
1. 编写server.php :
//1.构建Server对象, 默认创建的是一个同步的阻塞tcp服务
$host = '0.0.0.0'; //也可以用其他ip地址, 0.0.0.0 代表监听所有ip
$server = new Swoole\Server($host,9501);
// var_dump($server);
//2. 设置运行时的参数
//$server->set(array(
// 'worker_num'=>8, //工作进程数量
// 'daemonize'=>true //是否作为守护进程后台执行
//));
//3. 注册事件回调函数,回调函数一般用闭包函数,且先后顺序无所谓.
//监听连接进入事件,字面意思.
$server->on('connect',function($server,$fd){
echo 'Client:Connect';
});
//监听数据接收事件
$server->on('receive',function($server,$fd,$from_id,$data){
$server->send($fd,'Swoole:'.$data);
$server-close($fd);
});
//监听连接关闭事件
$server->on('close',function($server,$fd){
echo 'Client:close';
});
//监听swoole启动事件
$server->on('Start',function(){
echo 'swoole start';
});
//4.启动服务
$server->start();//阻塞与非阻塞
2. 记得一定使用命令行执行 php server.php 来运行.
3.报错提醒:
<1> 运行后没反应/看起来像是卡住了. 查看代码,是否监听了onstart 启动服务事件,事件中是否有输出内容.
<2> 记得关闭防火墙
<3> 报错 : failed to listen server port[0.0.0.0:9501], Error: Address already in use[98] in /www/wwwroot/swoole/server.php:2
使用 netstat -apn | grep 9501 命令来查看9501端口是否已经占用. 如果是, 例如进程pid为8513, 使用 kill -9 8513 命令.
然后再次执行 php server.php