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


    重大新特性

    支持 Redis/PDO/MySQLi

    4.1.0版本开始支持了对PHP原生RedisPDOMySQLi协程化的支持。

    可使用SwooleRuntime::enableCorotuine()将普通的同步阻塞RedisPDOMySQLi操作变为协程调度的异步非阻塞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__." 
    ";
        }
    }
    
    $cid = go(function () {
        test1();
    });
    
    go(function () use ($cid) {
        while(true) {
            echo "BackTrace[$cid]:
    -----------------------------------------------
    ";
            //返回数组,需要自行格式化输出
            var_dump(co::getBackTrace($cid))."
    ";
            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_objfree_obj保证内存安全, 防止错误的PHP代码引发内存问题
  • 相关阅读:
    python sys.argv[]
    python 继承
    python 类/对象
    Formily教程 | formily是中后台复杂场景的表单解决方案
    如何保障消息100%投递成功?如何保证消息幂等性
    rabbitmq延时重试队列
    IO多路复用之select、poll、epoll详解
    构建PHP微服务生态
    flutter dio 处理200以为的错误状态码
    [git] 如何查看 .patch 文件
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9749801.html
Copyright © 2020-2023  润新知