乐趣区

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

重大新特性
支持 Redis/PDO/MySQLi
从 4.1.0 版本开始支持了对 PHP 原生 Redis、PDO、MySQLi 协程化的支持。
可使用 SwooleRuntime::enableCorotuine()将普通的同步阻塞 Redis、PDO、MySQLi 操作变为协程调度的异步非阻塞 IO
SwooleRuntime::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 SwooleCoroutine::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]

其他修改

重构 CoChannel C 底层代码为 C ++, 解决复杂场景的非预期结果, 实现高稳定
重构 CoHttpClient C 底层代码为 C ++ 协程模式, 解决异步时序问题, 实现高稳定
支持在协程和 Server 中使用 exit, 此时将会抛出可捕获的 SwooleExitException 异常
移除所有迭代器 (table/connection/coroutine_list) 的 PCRE 依赖限制
增加 open_websocket_close_frame 配置, 可以在 onMessage 事件中接收 close 帧
废弃 HttpResponse->gzip()方法,改为使用 http_compression 配置项。底层会自动判断客户端传入的 Accept-Encoding 选择合适的压缩方法, 新增谷歌 BR 压缩支持
增加 CoHttpClient->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

CoHttpClient 使用了 create_obj 和 free_obj 保证内存安全, 防止错误的 PHP 代码引发内存问题

退出移动版