天天看點

Swoole 4.1.0 正式版釋出,支援原生 Redis/PDO/MySQLi 協程化

重大新特性

支援 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代碼引發記憶體問題