Swoole 4.1.0 正式版釋出,支援原生 Redis/PDO/MySQLi 協程化
阿新 • • 發佈:2018-12-09
重大新特性
支援 Redis/PDO/MySQLi
從4.1.0
版本開始支援了對PHP
原生Redis
、PDO
、MySQLi
協程化的支援。
可使用Swoole\Runtime::enableCorotuine()
將普通的同步阻塞Redis
、PDO
、MySQLi
操作變為協程排程的非同步非阻塞IO
Swoole\Runtime::enableCoroutine(); go(function () { $redis = new redis; $retval = $redis->connect("127.0.0.1", 6379); var_dump($retval, $redis->getLastError()); var_dump($redis->get("key")); var_dump($redis->set("key", "value")); $redis->close(); });
協程跟蹤
新版本增加了兩個方法用於跟蹤協程執行。
-
Coroutine::listCoroutines()
可遍歷當前所有協程 -
Coroutine::getBackTrace($cid)
可獲取某個協程的函式呼叫棧
function test1() { test2(); } function test2() { while(true) { co::sleep(10); echo __FUNCTION__." \n"; } } $cid = go(function () { test1(); }); go(function () use ($cid) { while(true) { echo "BackTrace[$cid]:\n-----------------------------------------------\n"; //返回陣列,需要自行格式化輸出 var_dump(co::getBackTrace($cid))."\n"; co::sleep(3); } });
BackTrace[1]: ----------------------------------------------- #0 Swoole\Coroutine::sleep(10) called at [/home/htf/workspace/swoole/examples/coroutine/backtrace.php:8] #1 test2() called at [/home/htf/workspace/swoole/examples/coroutine/backtrace.php:3] #2 test1() called at [/home/htf/workspace/swoole/examples/coroutine/backtrace.php:14]
其他修改
- 重構
Co\Channel
C底層程式碼為C++, 解決複雜場景的非預期結果, 實現高穩定 - 重構
Co\Http\Client
C底層程式碼為C++協程模式, 解決非同步時序問題, 實現高穩定 - 支援在協程和Server中使用
exit
, 此時將會丟擲可捕獲的\Swoole\ExitException
異常 - 移除所有迭代器(table/connection/coroutine_list)的PCRE依賴限制
- 增加
open_websocket_close_frame
配置, 可以在onMessage事件中接收close幀 - 廢棄
Http\Response->gzip()
方法,改為使用http_compression
配置項。底層會自動判斷客戶端傳入的Accept-Encoding
選擇合適的壓縮方法, 新增谷歌BR壓縮支援 - 增加
Co\Http\Client->addData()
方法,可將記憶體中的資料作為上傳檔案內容進行傳送 -
Solaris
系統支援 - Http2支援
MAX_FRAME_SIZE
分幀傳送和MAX_HEADER_LIST_SIZE
處理, 客戶端增加isStreamExist
方法檢測是否存在對應流 -
swoole_http_response->status
增加reason
引數 - 修復MySQL prepare 中無符號引數使用了有符號值導致數值溢位的問題
- 修復HTTP2的
onRequest
回撥中沒有協程的問題 - 修復
tasking_num
某些特殊情況下變為-1
的問題 - 修復HTTP2-server的window-update幀構造錯誤
- 修復所有PHP版本下的所有級別的編譯warning
- GCC版本小於4.8時將會產生編譯錯誤
- 修復MySQL使用prepare時未使用引數繫結導致的記憶體分配不斷增長
- 修復HTTP2重連時舊stream記憶體丟失洩露
底層開發相關
- 統一檔案命名 #970
-
Co\Http\Client
使用了create_obj
和free_obj
保證記憶體安全, 防止錯誤的PHP程式碼引發記憶體問題