性能上Swoole毕竟是C语言开发的,在某些地方如内存管理、数据结构、通信协议解析上肯定要比PHP开发的workerman高。功能上swoole提供的高级特性很多,列举几个workerman没有的吧,比如SSL/TLS隧道加密、http2.0、异步mysql驱动、异步redis驱动、异步的http/websocket客户端、process、lock、atomic、table。另外Swoole 2.0内置了PHP原生协程的支持,PHP代码也可以使用类似于Go语言的协程来实现高并发的网络服务器。外部依赖上workerman需要依赖很多额外的第三方PHP扩展来实现,局限性比较大,这些扩展并非是PHP官方维护的,维护性方面良莠不齐,有些扩展连PHP7都不支持,数年没人维护。而Swoole基本上无依赖,底层的代码全部可控。开发维护方面,Swoole的开发团队目前有大概18人左右,开发者基本上都是来自腾讯、百度、阿里、滴滴、微博等国内一线互联网企业,支持维护的团队更稳定。当然workerman的优势是它完全使用PHP代码实现,开发者可以直接看它的源码。有特殊需求也可以直接改源码来实现。如果换成swoole就不是那么简单了。workerman做的事情更多一些,即是框架又是工具和完整的解决方案,对于没有太多后端编程功底的程序员也来说确实会容易很多。而swoole实际上只是一个底层库,不是拿来可用的完整产品,基于swoole有很多PHP的框架和程序,比如tsf、zan php framework、hprose-swoole、zphp、swoole/framework、blink、dorarpc、SwooleDistributed等等,普通开发者可以直接基于这些项目进行开发。
安装
基于CentOS7,宝塔面板,Swoole-2.x,PHP7.0.0
git clone https://gitee.com/swoole/swoole
cd swoole
phpize
./configure --with-php-config=/www/server/php/70/bin/php-config
在php.ini加入:
extension=/www/server/php/70/lib/php/extensions/no-debug-non-zts-20151012/swoole.so
这里要注意php的版本。Swoole-1.x需要5.3.10+,Swoole-2.x需要php7.0.0+
通过 php -m 检查当前安装的扩展有没有swoole。
基于CentOS5.3,宝塔面板,Swoole-1.x,PHP5.4
下载swoole-swoole-v1.10.3.zip
yum install unzip zip -y
unzip swoole-swoole-v1.10.3.zip
cd swoole
./configure --with-php-config=/www/server/php/54/bin/php-config
vim /www/server/php/54/etc/php.ini
加入
extension=/www/server/php/54/lib/php/extensions/no-debug-non-zts-20100525/swoole.so
参考:
https://wiki.swoole.com/wiki/page/6.html
异步redis客户端支持
参考:https://wiki.swoole.com/wiki/page/p-redis.html
首先下载:https://github.com/redis/hiredis/releases
tar -zvf hiredis
make -j
sudo make install
sudo ldconfig
编译swoole加入–enable-async-redis
./configure --with-php-config=/www/server/php/54/bin/php-config --enable-async-redis
make clean
make -j
sudo make install
测试程序
创建tcp服务器
<?php
//创建Server对象,监听 所有网卡的9501端口
$serv = new swoole_server("0.0.0.0", 9501);
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, "Server: ".$data);
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$serv->start();
运行:
在客户端使用TCP/UDP测试工具测试,
创建websocket服务器
<?php
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
var_dump($request->fd, $request->get, $request->server);
$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
参考:
https://wiki.swoole.com/wiki/page/479.html