Skip to content

swoole v6.1.0 RC1 版本更新记录 #94

@NathanFreeman

Description

@NathanFreeman

标准库扩展

6.1 版本 Swoole-Cli 将增加 PHP 标准库扩展语法,在保持对 PHP 官方语法完整兼容的同时,提供一些额外的新语法。这些新的扩展语法均是可选的,不影响现有的PHP代码。标准库扩展语法将在ext-swoolestdext模块中实现。

  • swoole-cli 用户,可直接使用,无需设置任何额外的参数
  • ext-swoole 的用户,需在编译时添加--enable-swoole-stdext来启用
  • stdextphp-cliphp-fpmcli-http-serverswoole 模式均可使用

1. 基础类型对象化

6.1 版本实现了array/string/stream基础类型的对象化封装,支持面向对象风格的方法调用,可直接对这些类型的变量调用内置方法。

基础类型的内置方法实际上仍然是调用PHP标准库实现的,内置方法与PHPstr_array_系列函数是一一对应关系,例如$text->replace()对应的函数是str_replace。底层仅调整了函数名称,少量方法调整了参数顺序,还有几个方法调整了参数和返回值类型,详情请查看 Swoole 文档

$text = 'Hello Swoole';
var_dump($text->length());
echo $text->lower()->replace("swoole", "php");

2. Typed-Array 强类型数组

可限制数组类型,如:MapArrayList,以及限制keyvalue的类型。支持多层嵌套格式。typed array实际上依然是array类型,底层仅在写入时进行参数检查。typed array可作为array传递给其他函数或类方法。

$array = typed_array('<int, string>');
$array[1000] = "hello"// 正确
$array[2000] = 2025// 错误,抛出异常

新特性

  • llHTTP 默认解析器:自 v6.1.0 起,Swoole 采用性能更优的 llhttp 替代 http_parser 作为默认 HTTP 报文解析器。
  • 协程化文件下载Swoole\Coroutine\Http\Client 现支持完整的协程化文件下载操作。
  • 异步文件截断:新增 iouring ftruncate 支持,扩展异步文件操作能力。

🐛 Bug 修复

  • 线程模式优化
    • 修复 SWOOLE_THREAD 模式下 hook_flags 设置失效问题。
    • 修复因工作线程达到max_request限制重启后,导致心跳线程持有失效指针并访问已释放内存的问题。
    • 修复不支持单独重启Task进程的问题。
  • 稳定性提升
    • 修复同步进程(含 manager 进程和 task 进程)无法正常使用process::signal()的问题。
    • 修正工作进程异常退出时的资源清理机制。
    • 解决 Cygwin 平台编译失败问题。
    • 修复curl开启keepalive无法复用socket的问题。
    • 改进日志组件以解决多线程模式下的数据一致性问题。
    • 修复io_uringfutex特性在ubuntu24.04编译失败的问题。
    • 修复结构体顺序赋值在低版本的linux系统会编译失败的问题。
    • 修复直接实例化的Swoole\Process对象其id属性未初始化的问题。
  • 兼容性改进
    • 修复 PHP 8.5 下 php_swoole_register_shutdown_function 兼容性问题。
    • 修正 Swoole\Table::get() 对 null 参数的处理。
  • 协议处理
    • 优化HTTP请求头与响应头中重复字段的处理机制,确保其正确合并。
    • 修复当系统没有zlib时,处理客户端Accept-Encoding: zlib请求头会触发未知压缩方法警告的问题。

废弃

  • 不再支持select事件机制,select仅支持1024个句柄的事件监听,存在严重缺陷,在不支持epoll/kqueue的平台将使用poll作为事件轮训机制,这使得Cygwin平台下也可以支持大量并发。
  • Swoole\Server::stop()方法中,第二个参数$waitEvent已被废弃,请使用reload_async参数。

🛠️ 架构优化

6.1版本增加了大量核心模块的单元测试,测试覆盖率提升至86%。通过系统性地补充测试用例并重构底层代码逻辑,同时结合clang-tidy工具链开展全量静态代码分析,实现了代码的自动化格式规整与冗余清理,使得代码可读性与可维护性得到显著提升。

  • 优化底层SSL模块。
  • 优化底层Socket模块。
  • 重构底层同步信号模块。
  • 重构底层reactorstring模块。
  • 重构底层基于SIGRTMIN信号实现日志文件动态重载。
  • 优化底层静态文件服务器,移除C风格代码,统一为C++风格的代码。
  • 优化线程初始化逻辑,提高多线程性能,独立管理结构内存,线程创建和退出不需要再加锁。
  • 移除底层async模块中的socket_dontwait选项,该选项已废弃。
  • 完善WebSocket掩码处理的测试覆盖。
  • 优化sendfile功能,当文件小于64KB时不设置tcp_cork选项。
  • 增加aarch64macOS环境下的单元测试。
  • 优化底层客户端网络地址解析和设置。
  • Server模块增加ssl_cafile/ssl_capath配置项。
  • 增加print_backtrace_on_error配置,此配置可以在发生位置错误时候,打印C函数的堆栈。
  • 增加Address Sanitizer调试工具。
  • 增加Cygwin测试,显著提升Cygwin平台下的兼容性和稳定性
  • macOS 系统中,由于 kqueue 事件机制不支持跨进程管道事件监听,导致无法使用 SWOOLE_PROCESS 模式和 Task 进程功能。因此,系统将默认采用 poll 作为底层事件机制。如需启用 kqueue,可以通过Swoole\Server::set(['enable_kqueue' => true])swoole_async_set(['enable_kqueue' => true])方法手动开启。

⚠️ 注意

  • 该版本为RC版本非正式版,仅推荐在测试环境中使用,不建议在生产环境中使用。

🙏 致谢

诚挚感谢 @matyhtf @jingjingxyk @KIMDONGYEON00 @ServBayDev @NathanFreeman 所有贡献者的专业付出,Swoole 因你们而更强大!愿开源社区伙伴身体健康,万事如意,工作顺利。

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions