PSL 6.0.0
这是 PHP Standard Library (PSL) 项目有史以来最大的一次发布。新地址、新包结构、新功能。
新地址
PSL 已经搬家了。仓库、组织、网站全部换了新地址:
- 仓库:https://github.com/php-standard-library/php-standard-library (原来是 azjezz/psl)
- 网站:https://php-standard-library.dev/ (原来是 psl.carthage.software)
- Packagist:php-standard-library/php-standard-library (原来是 azjezz/psl)
原来的 azjezz/psl 包现已废弃。请使用以下命令切换:
composer require php-standard-library/php-standard-library
命名空间保持不变,永远都是 Psl\。
拆分成 61 个独立包
PSL 现在被拆分成 61 个可独立安装的包,你不再需要引入整个库。
- 只想要类型安全的类型转换? →
composer require php-standard-library/type - 要写异步 TCP 服务器? →
composer require php-standard-library/tcp - 需要处理 URI? →
composer require php-standard-library/uri
每个包都只声明自己真正需要的依赖,所以你只安装实际用到的部分。
当然,如果你还是想要全家桶,也可以继续用:
composer require php-standard-library/php-standard-library
全部 61 个包都放在 php-standard-library 这个 GitHub 组织下面,每个包都有独立的只读拆分仓库供 Composer 使用。
新增的重要组件
URI / IRI / URL 处理
完整支持 RFC 标准的资源标识符处理:
- URI:RFC 3986 解析、规范化、引用解析、RFC 6570 URI Template(1-4 级)扩展
- IRI:RFC 3987 国际化资源标识符,支持 Unicode、Punycode、IDNA 2008
- URL:严格的 URL 类型,带 scheme/authority 校验,默认端口自动剥离
Punycode
独立的 RFC 3492 Punycode 编解码,用于国际化域名。
新的取消机制(Cancellation Tokens)
全面替换原来的 Duration $timeout 参数模式,所有异步/IO 操作现在使用统一的取消机制:
CancellationTokenInterface —— 基础接口TimeoutCancellationToken —— 超时自动取消SignalCancellationToken —— 手动触发取消LinkedCancellationToken —— 任意一个子 token 取消就整体取消
其他亮点
TaskGroup 和 WaitGroup —— 支持结构化并发- QuotedPrintable 和 EncodedWord 编码(RFC 2045 / 2047)
- 支持流式处理的 Base64 / Hex / QuotedPrintable IO 句柄
TLS\Listener —— 可以给任意 Listener 包一层 TLSTCP\RestrictedListener —— 支持基于 IP/CIDR 的访问控制Network\CompositeListener —— 同时监听多个地址BufferedReadHandleInterface 新增 readByte()、readLine()、readUntil() 等方法- TCP、Unix、UDP、Socks 等都改用配置对象
重大破坏性变更(Breaking Changes)
这是一个大版本,包含大量破坏性变更,最重要的几点:
- 取消机制替换超时参数所有原来的
null|Duration $timeout 都变成了 CancellationTokenInterface $cancellation = new NullCancellationToken()。
// 5.x 写法$data = $reader->read(timeout: Duration::seconds(5));// 6.0 写法$data = $reader->read(cancellation: new Async\TimeoutCancellationToken(Duration::seconds(5)));
命名规范统一为 camelCase所有变量、参数、属性都改为 $camelCase 风格。
配置对象化TCP\listen()、TCP\connect()、Unix\listen()、UDP\Socket::bind()、Socks\Connector 等都改用配置对象,不再是散列参数。
超时异常被移除IO\Exception\TimeoutException、Network\Exception\TimeoutException 等全部移除,统一使用 Async\Exception\CancelledException。
TLS 类名变更TLS\ServerConfig → TLS\ServerConfigurationTLS\ClientConfig → TLS\ClientConfiguration
Bug 修复
- RetryConnector 的退避睡眠现在尊重取消 token
IO\write()、IO\write_line()、Str\format() 等在消息含 % 但没传参数时不再崩溃