?
PHP的高性能异步网络通信框架Swoole已发布 1.8.0 版本,此版本是一个里程碑式新版本,新增了多项新特性、多项核心功能优化以及问题修复、移除了无效的特性。更新内容如下:
客户端
- 增加原生异步MySQL客户端
- 增加原生异步Redis客户端,基于Redis官方提供的hiredis库
- 增加原生异步Http客户端
- 增加原生异步WebSocket客户端支持
- 重构底层swClient,异步TCP客户端实现放到swoole内核中
- 增加
swoole_client->reuse
属性,SWOOLE_KEEP
长连接模式下标识是否为复用的连接
服务器端
- 重构websocket服务器代码,底层与
length_check
协议复用相同的处理函数,增强稳定性 - 增加
Task
进程对tick/after
定时器的支持,底层基于高精度的setitimer
+信号实现 - 保存构造函数中传入的host、port参数到
swoole_server
对象属性 - 增加多端口多协议的支持(重要更新)
- 增加
swoole_server->defer
函数用于延时执行一些函数 - 增加
swoole_server->close
强制切断连接的选项,设置第二个参数会true会清空发送队列并立即切断连接
多端口多协议示例:
$serv = new swoole_server("0.0.0.0", 9501);$port2 = $serv->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP);$port2->set(array( 'open_length_check' => true, 'package_length_type' => 'N', 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //第几个字节开始计算长度 'package_max_length' => 2000000, //协议最大长度));$port2->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { echo "ServerPort2n";});$serv->on('connect', function ($serv, $fd, $from_id){ echo "[#".posix_getpid()."]tClient@[$fd:$from_id]: Connect.n";});$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { echo "[#".$serv->worker_id."]tClient[$fd]: $datan"; if ($serv->send($fd, "hellon") == false) { echo "errorn"; }});$serv->on('close', function ($serv, $fd, $from_id) { echo "[#".posix_getpid()."]tClient@[$fd:$from_id]: Close.n";});$serv->start();
其他
- 增加swoole_table对key值的存储,
foreach
遍历table时可以获取到key值 - 更改swoole_table的key对比模式,从crc32比对改为直接进行字符串对比
- 更新utlist.h库到
1.9.9
版本
swoole_table保存Key值会增加内存占用,如table的size为100万,KEY值存储会增加64M内存占用
问题修复
- 修复启用消息队列后发生double-free问题
- 重构定时器,修复
after
、tick
定时器偶然出现的core dump
的问题 - 定时器使用最小堆数据结构,插入/删除时间复杂度为
log(N)
- 修复
swoole_process::signal
在PHP7下发生core dump
的问题 - 修复
swoole_async_write
在PHP7下发生core dump
的问题
移除特性
- 移除未支持的特性相关历史遗留代码,如
heartbeat_ping
、dispatch_key_type
等 - 移除
swoole_server->addtimer
、swoole_server->deltimer
、swoole_server->gettimer
- 移除
swoole_timer_add
、swoole_timer_del
- 移除
swoole_server
的onTimer
事件 - 移除
task_worker_max
配置及相关特性代码 - 移除
swoole_server->handler
方法
?
?