1. 程式人生 > >Swoole 4.1.0 正式版發布,支持原生 Redis/PDO/MySQLi 協程化

Swoole 4.1.0 正式版發布,支持原生 Redis/PDO/MySQLi 協程化

ask backtrace exit 情況下 red chan list 格式化輸出 兩個

重大新特性

支持 Redis/PDO/MySQLi

4.1.0版本開始支持了對PHP原生RedisPDOMySQLi協程化的支持。

可使用Swoole\Runtime::enableCorotuine()將普通的同步阻塞RedisPDOMySQLi操作變為協程調度的異步非阻塞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_objfree_obj保證內存安全, 防止錯誤的PHP代碼引發內存問題

Swoole 4.1.0 正式版發布,支持原生 Redis/PDO/MySQLi 協程化