4.3.0 [大版本]

新增

  • 新增Co::getContext获取协程上下文对象 (RFC-1018) (@twose)
  • 新增Co::getPcid获取父协程ID (RFC-1017) (@twose)
  • 新增Co::exists判断协程是否存在 (@twose)
  • 协程Hook支持stream_select (#2358) (matyhtf)
  • BASE模式下增加max_wait_time配置支持 (#2282) (@shiguangqi)
  • 支持在Master/Manager/User进程中单向投递任务 (RFC-1015) (@matyhtf)
  • Co\Socket模块新增recvAllsendAll两个API, 用于确保完整收/发数据, 直到完成或产生错误 (3700cbb)(@twose)
  • Process支持协程模式, 具体请参考 (Process中使用协程)
  • 新增Server->getCallback方法获取Server指定名称的回调函数 (@matyhtf)

增强

  • 现在默认的最大连接数是100K (而不是10K), 如果系统配置小于此数量时取系统配置 (3d2e387) (@twose)

  • 优化Timer定时器的底层代码, 现在它的运行速度更快, 并且支持任意数量的传参 (#2347) (@twose)

  • Co::stats将展示更多信息如事件数量, 监听信号数量, aio任务数量等 (@matyhtf)

  • Co::getBackTrace在不传参时等同于获取当前调用栈即debug_backtrace, 便于代码统一书写 (@twose)
  • Co::listCoroutines重命名为Co::list, 但仍保留原名作为别名(向下兼容) (@twose)
  • Table::exist, Server::exist皆重命名为exists, 但仍保留原名作为别名(向下兼容) (@twose)

  • Redis自动重连时将会自动鉴权和选择对应的数据库, 新增API: getOptions, getAuth, getDBNum(#2303) (fdac8a3) (@windrunner414 & @twose)

  • FreeBSD下默认Socket缓冲区应为2M (750a29c) (@twose)
  • Server->stats返回值新增worker_dispatch_count来得到master向当前进程投递请求数量, 可通过worker_dispatch_count - worker_request_count来获得排队中的请求数量 (a353808) (@matyhtf)
  • 移除Nghttp2依赖, 可无需安装, 直接编译选项开启
  • 协程现在没有最大嵌套层数限制, 可无限嵌套(协程之间并没有实质的嵌套关系) (5458cbc) (@twose)
  • 协程达到上限时, http服务器将会返回503错误表示服务暂时不可用 (ebd377f) (@twose)
  • defer现在会接收一个参数, 其值为协程结束时的返回值 (example) (@twose)

修复

  • 修复task方法传递null参数时出错的问题 (#2366) (@twose)
  • 修复Http客户端发送大数据时发送不完整的问题 (#2360) (@twose)
  • 修复TCP客户端使用eof协议时, 缓冲区中未处理的数据丢失的问题 (a59ae39) (@twose)
  • 修复Server Reload的异步安全性 (022f859) (@matyhtf)
  • 修复连接迭代器的索引值 (b066146) (@twose)
  • 修复Set-Cookie时, 特殊字符过长被截断 (#2368) (@mabu233 & @twose)
  • 修复Http客户端没有解码cookie的问题(发送时重复编码) (069ca5d) (@twose)
  • 修复Http客户端下载时使用超时功能导致coredump (#2377) (@matyhtf & @twose)
  • 修复__call+call_user_func*调用MySQL客户端方法时产生的coredump (#2387) (@matyhtf)
  • 修复Http2客户端header名传入数字时产生的coredump (#2375) (@mabu233)
  • 修复Swoole\Event::Dispatch行为不符合预期 (#2390) (@matyhtf)
  • 修复PHP7.0.x极低版本下编译失败 (768b8a7) (@shiguangqi)
  • 修复Socks5代理握手失败 (94ef96c) (@twose)
  • 修复低版本LINUX内核下连接失败导致的内存读错误 (5adf625) (@matyhtf & @twose)
  • 修复Server在BASE单进程模式下在master进程使用定时器无效的问题 (82eca13) (@twose)
  • 修复由于低版本ZendAPI不稳定可能导致的编译不通过的问题 (768b8a7) (@shiguangqi)
  • 修复调用sendto时返回EINVAL (#2395) (@junwei)

禁止

  • 禁止在使用异步文件IO后创建Server或创建自定义进程
  • 禁止在协程内创建Server或创建自定义进程

移除

  • Websocket\Server->exists只判断连接是否存在, 请使用isEstablished方法判断是否为Websocket客户端
  • 移除swoole.fast_serialize配置项
  • 移除了协程客户端方法调用失败时产生的Warning, 统一使用返回值和错误码判断
  • 移除Server->gzip方法
  • 移除PicoHttpParser支持

移除异步模块

移除所有异步模块, 分离异步扩展到 async-ext 移除的异步模块如下:

  • Async系列函数
  • MySQL
  • Redis
  • Http\Client
  • Channel
  • Memory\Pool
  • MsgQueue
  • RingQueue

单元测试

  • 测试支持在任意装有docker的主机上运行并自动部署基于docker的swoole/mysql/redis容器, 详情参阅源码目录下travis文件夹内的README文档


  • 方向感

    4.3 zookeeper 协程客户端支持吗,文档里面没看到

  • 挨暗蜡烛

    火钳刘明

  • 笑对人生ㄟ

    向那些站在技术前沿大佬们的奉献致敬

  • sundays

    请问一下,为什么到这个版本会把Async移除呢? 是有什么不好吗

  • 子非鱼

    @sundays 用协程替代了异步,可以用同步编程实现异步的效果,增强了代码的可读性和可维护性

  • duzh

    之前用4.2.13协程写了一个轮询TCP连接服务,可以连接并进行请求 返回数据处理.昨天升级到4.3后协程内些的循环有不执行问题

  • 秋枫

    register_shutdown_function 捕捉不到致命错误