Swoole 4.1 发布,支持原生 Redis/PDO/MySQLi 协程化

matyhtf
 matyhtf
发布于 2018年09月06日
收藏 8

Swoole 4.1 发布了,更新如下:

重大新特性

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

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Swoole 4.1 发布,支持原生 Redis/PDO/MySQLi 协程化
加载中

最新评论(11

voov
voov

引用来自“tokimekis”的评论

也就是说协程redis不需要再整个hiredis异步扩展了吗?

引用来自“宇润”的评论

Swoole\Runtime::enableCoroutine();运行后,可以直接用new \Redis()这个类,如果你要用swoole提供的Redis类依然要装hiredis
这样使用后如何测试标明使用了协程呢?谢谢
terrence_tian
terrence_tian
第一眼看到go关键字还已为是golang
纵度飞行
纵度飞行
协程
奔跑的大牛
奔跑的大牛
6666666666
高久峰
高久峰
swoole plus版本
koyly
koyly
NB Plus
MuskIron
MuskIron
应该是4.1.2发布吧,4.1已经发布了
宇润
宇润

引用来自“tokimekis”的评论

也就是说协程redis不需要再整个hiredis异步扩展了吗?
Swoole\Runtime::enableCoroutine();运行后,可以直接用new \Redis()这个类,如果你要用swoole提供的Redis类依然要装hiredis
老大哥
老大哥
赞,支持。
t
tokimekis
也就是说协程redis不需要再整个hiredis异步扩展了吗?
返回顶部
顶部