?
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
方法
?
?