天天看点

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代码引发内存问题