ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

guzzlehttp/psr7 版本演进全解读:从 1.0 到 2.1 的 PSR-7 消息实现关键变更

guzzlehttp/psr7 版本演进全解读:从 1.0 到 2.1 的 PSR-7 消息实现关键变更 后端应用安全图像处理【免费下载链接】captcha行为验证码(滑动拼图、点选文字)前后端(java)交互包含h5/Android/IOS/flutter/uni-app的源码和实现项目地址https://gitcode.com/gh_mirrors/captc/captcha点击查看免费下载导读本文以 captcha 仓库 PHP 服务端依赖树中的 service/php/vendor/guzzlehttp/psr7/CHANGELOG.md 为骨架完整梳理 PSR-7 消息实现库 guzzlehttp/psr7 从 1.0.0 到 2.1.0 的全部版本变更覆盖 2.x 的破坏性重构、函数 API 向静态方法 API 的迁移、RFC 3986 URI 工具家族、PSR-17 工厂引入以及历次兼容性修复。读完本文你将能准确区分 1.x 与 2.x 的行为差异掌握从旧版升级的迁移对照表并在自己的 PHP 项目中正确使用其消息、流、URI 与查询串工具方法。1. 文档背景一份藏在 vendor 目录里的 PSR-7 实现变更日志guzzlehttp/psr7是 PHP-FIG 标准 PSR-7与其同目录的还有intervention/、psr/、ralouphie/等依赖包共同构成 PHP 行为验证码服务包名fastknife/ajcaptcha见 service/php/composer.json的第三方依赖树。本次解读的主体 CHANGELOG.md 遵循 Keep a Changelog 的条目格式并严格采用语义化版本控制Semantic Versioning主版本号变更意味着破坏性变更次版本号表示向后兼容的新功能修订号表示向后兼容的缺陷修复。从日志末尾的版本对比链接可以看出该文档完整记录了 2015 年 1.0.0 首发到 2021 年 2.1.0 之间约六年、二十余个版本的全部变更是理解该库演进脉络的第一手资料。该包的运行约束与依赖关系同样记录在仓库内service/php/vendor/guzzlehttp/psr7/composer.json 声明了 PHP 版本要求^7.2.5 || ^8.0运行时依赖psr/http-factory^1.0、psr/http-message^1.0与ralouphie/getallheaders^3.0并通过provide声明自己是psr/http-factory-implementation与psr/http-message-implementation的实现提供者许可证为 MIT。需要说明的是从 service/php 源码整体搜索结果看captcha 业务代码service/php/src下的 Domain/Service/Utils 等并未直接引用GuzzleHttp\Psr7命名空间该包属于 Composer 传递依赖链中的一员但其 CHANGELOG 与 README 所记录的 API 细节对任何使用 PSR-7 生态的 PHP 开发者都具有直接参考价值。2. 2.x 主线面向现代 PHP 的破坏性重构2.0.0beta-1 → 2.1.02.x 是 guzzlehttp/psr7 最重要的里程碑其变更集中在2.0.0beta-12021-03-21这一个版本中新增AddedPSR-17 工厂factories引入了Psr\Http\Message\RequestFactoryInterface等 PSR-17 标准工厂接口的实现使请求、响应、流、URI 等对象的创建方式标准化。所有类改为final禁止继承收紧扩展点避免子类行为破坏核心实现的不变量。PHP 7 类型提示方法签名全面引入标量类型与返回类型声明提升静态分析与 IDE 辅助能力。变更Changed构建查询字符串时布尔值以1和0表示而不是字符串true/false与多数服务端解析行为保持一致。移除Removed放弃 PHP 7.2 支持这也是 composer.json 中php: ^7.2.5 || ^8.0的由来。移除Guzzle\Psr7命名空间下的全部函数强制用户迁移到静态方法 API详见第 3 节对照表。随后的 RC 与正式版继续打磨2.0.0RC-12021-04-29修复stream_get_meta_data返回数组中url键可能未设置unset的问题避免触发未定义索引警告。2.0.02021-06-30与 RC-1 完全一致未再引入任何额外变更。2.1.02021-10-06是 2.x 的首次小版本更新包含两项值得关注的变化新增MalformedUriException当尝试从一个格式错误的 URI 字符串创建Uri对象时不再抛出通用的InvalidArgumentException而是抛出继承自前者的MalformedUriException保持向后兼容。原有依赖异常来检测非法 URI 的调用方应改为捕获这个新异常以获得更精确的错误定位。修复CachingStream的 size 返回当远端流的 size 为null时缓存的流大小也应返回null而不是一个误导性的数值。3. 1.7 / 1.8从函数 API 到静态方法 API 的过渡期1.x 时代最影响日常使用的演进发生在 1.7.0 与 1.8.01.7.02020-09-30将命名空间内的全局函数全部替换为静态方法。原因在于全局函数在不同副本全局与局部安装之间容易产生命名冲突静态方法则不存在该问题。同期修复了将不可 seek 的流转为字符串、正确处理多个 Set-Cookie 头、合并头时忽略数组键、Message::bodySummary()支持多字节字符等问题并恢复了部分 HHVM 3 支持。1.8.02021-03-21实现区域无关locale independent的 URL 解析避免服务器区域设置影响setlocale类场景下的解析结果绝大多数类添加了final注解为 2.0 的强制 final 做预告修复了未安装 curl 扩展时从php://input创建流失败以及PHP 8 下Utils::tryFopen()失效的问题。1.8.12021-03-21修复IPv6 URL 解析问题以及ServerRequest经with*方法修改后丢失全部属性attributes的问题。对于从 1.6 及更早版本升级的开发者vendor 目录下的 README.md 提供了完整的函数 → 静态方法迁移对照表现完整列出原函数替代静态方法strMessage::toStringuri_forUtils::uriForstream_forUtils::streamForparse_headerHeader::parsenormalize_headerHeader::normalizemodify_requestUtils::modifyRequestrewind_bodyMessage::rewindBodytry_fopenUtils::tryFopencopy_to_stringUtils::copyToStringcopy_to_streamUtils::copyToStreamhashUtils::hashreadlineUtils::readLineparse_requestMessage::parseRequestparse_responseMessage::parseResponseparse_queryQuery::parsebuild_queryQuery::buildmimetype_from_filenameMimeType::fromFilenamemimetype_from_extensionMimeType::fromExtension_parse_messageMessage::parseMessage_parse_request_uriMessage::parseRequestUriget_message_body_summaryMessage::bodySummary_caseless_removeUtils::caselessRemove4. 1.5 / 1.6稳定期的合规性加固与兼容性细节4.1 1.6.x向 PSR-7 与 RFC 标准对齐1.6.02019-06-30是本阶段信息量最大的版本依赖ralouphie/getallheaders放宽到^3.0新增WEBP 图片格式的 MIME 类型映射依据 PSR-7 与 RFC 标准增加更多值校验例如状态码范围校验如 #250、#272因测试无法通过 HHVM 4.0正式放弃 HHVM 支持接受0 作为合法端口号#270修复ServerRequest中php://input的连续多次读取#247、特定流模式下的可读/可写检测#248、URIuserInfo组件中特殊字符的编码#253。1.6.12019-07-02修复回归——再次允许 null 与布尔类型的头值确保与宽松的传入习惯兼容。4.2 1.5.x消息摘要与流行为完善1.5 系列围绕「消息体摘要body summary」与流装饰器做了系列打磨1.5.02018-12-03新增get_message_body_summary函数以获取消息摘要新增3gp、mkv的 MIME 类型将响应首行纳入响应字符串化的异常信息修复 #145按 RFC 7230弃用折叠头行folded header lines的解析修复AppendStream::detach不应关闭内部流、InflateStream应保留底层流的isSeekable属性、ServerRequest::getUriFromGlobals支持 URL 出现在查询参数中等问题。1.5.12018-12-04仅在 body可读时才获取摘要。1.5.22018-12-04获取摘要前先检查 body 大小避免读取过大或未知大小的消息体。5. 1.4RFC 3986 URI 工具方法家族诞生1.4.02017-02-21是 1.x 中功能性最强的一次发布它围绕 RFC 3986 引入了一整套 URI 工具方法新增的 URI 判断与组合方法Uri::isDefaultPort判断 URI 是否使用当前 scheme 的默认端口Uri::isAbsolute判断是否为绝对 URI含 schemeUri::isNetworkPathReference网络路径引用如//example.com/pathUri::isAbsolutePathReference绝对路径引用如/pathUri::isRelativePathReference相对路径引用如subpathUri::isSameDocumentReference同文档引用除 fragment 外与基准 URI 完全一致Uri::composeComponents按 RFC 3986 5.3 节由各组件拼装 URI 字符串UriNormalizer::normalize与UriNormalizer::isEquivalentURI 规范化与等价性判断UriResolver::relativize由基准 URI 与目标 URI 生成相对引用。URI 合法性强制行为变更需特别注意从该版本起每次 URI 修改都必须产生符合 PSR-7 讨论结论的合法 URI非法修改直接抛异常而非魔法式纠错// 含有 authority 的 URI其 path 必须以 / 开头或为空否则抛异常 (new Uri)-withPath(foo)-withHost(example.com); // 只设置 scheme 时返回带默认主机 localhost 的绝对 URI (new Uri())-withScheme(http); // 返回 http://localhost弃用与替换Uri::resolve与Uri::removeDotSegments被弃用分别由UriResolver::resolve与UriResolver::removeDotSegments取代。此外还修复了Stream::read在 length 参数 0 时的行为、copy_to_stream改为分块读取而非一次性读满maxLen进内存、getUriFromGlobals在 Host 头含端口时的处理、filescheme 且空 host 的兼容性等。后续两个补丁版本值得关注1.4.12017-02-27为保持向后兼容恢复了自动为带 authority 的相对路径补前导斜杠的旧行为但标记为弃用并引入对静默弃用警告的触发机制。1.4.22017-03-20因 1.4.1 移除trigger_error引发了另一处 BC 破坏本版本回退该变更恢复Uri::resolve与Uri::removeDotSegments调用时的弃用警告行为。6. 1.0 – 1.3早期能力建设6.1 起点1.0.02015-05-19初始发布。当时的明确缺口是尚不支持Psr\Http\Message\ServerRequestInterface与Psr\Http\Message\UploadedFileInterface这两项能力直到 1.3.0 才补齐。6.2 1.1.02015-06-24URI 现在支持相对引用multipart/form-data头可被大小写不敏感地覆盖URI path 不再编码这些 RFC 允许的字符( ) * ! 当 scheme 缺失且未指定端口时不再向 URI 附加端口。6.3 1.2.x2015-08-15 2016-02-181.2.0消息体为字符串0时能正确写入响应CachingStream支持向前 seekparse_request能正确解析包含**代理目标proxy target**的请求functions.php改为按需条件引入URI 解析时不再丢弃user-info。1.2.1SEEK_END支持负偏移。1.2.2支持无 authority 的 URI支持 HTTP 451Unavailable For Legal Reasons状态码支持以0作为文件名Host 头支持非标准端口。1.2.3CachingStream对远程流 seek 时可能返回少于请求字节数fread行为的情况做了兼容修复带 FNAME 头的 gzip 响应处理。6.4 1.3.x2016-04-13 2016-06-251.3.0补齐 PSR-7剩余接口ServerRequestInterface、UploadedFileInterface等stream_for支持从标量创建流Uri类允许被继承请求方法校验放宽、更宽松避免误伤合法方法。1.3.1 是一批边界修复网络路径引用如//example.org的__toStringhost 的小写归一化0作为 URI 组件如 user-info 密码的处理withAddedHeader对不同大小写头的合并与头值去首尾空白按 RFC 7230 3.2.4 节头名不做此处理withAddedHeader支持数组形式的头值Uri::resolve在基准路径无斜杠及 fragment 处理with(out)QueryValue的编码一致性键/值均可传已编码或未编码形式ServerRequest::withoutAttribute在属性值为 null 时的处理。7. 版本时间线总表版本日期核心要点1.0.02015-05-19初始发布暂不支持 ServerRequest / UploadedFile 接口1.1.02015-06-24URI 支持相对引用multipart 头大小写不敏感覆盖路径放行( ) * ! 1.2.02015-08-15body0正确入响应CachingStream 向前 seekparse_request 支持代理目标1.2.12015-11-02SEEK_END 支持负偏移1.2.22016-01-22无 authority URIHTTP 4510文件名非标准端口 Host1.2.32016-02-18CachingStream 远程向前 seekFNAME gzip 响应1.3.02016-04-13补齐 PSR-7 全部接口stream_for 支持标量Uri 可继承1.3.12016-06-25网络路径__toStringhost 小写归一化withAddedHeader 合并/去空白1.4.02017-02-21RFC 3986 URI 工具方法族URI 合法性强制弃用 resolve/removeDotSegments1.4.12017-02-27恢复自动补前导斜杠弃用 静默弃用警告1.4.22017-03-20回退 BC 破坏恢复 trigger_error 行为1.5.02018-12-03get_message_body_summary3gp/mkv MIME弃用折叠头行1.5.12018-12-04仅可读 body 取摘要1.5.22018-12-04取摘要前检查 body 大小1.6.02019-06-30getallheaders ^3.0WEBP MIME状态码校验php://input 连续读取修复1.6.12019-07-02重新接受 null / bool 头值1.7.02020-09-30函数替换为静态方法多 Set-Cookie 处理bodySummary 多字节1.8.02021-03-21区域无关 URL 解析final注解tryFopen PHP 8 修复1.8.12021-03-21IPv6 URL 解析ServerRequest 修改保留属性2.0.0beta-12021-03-21PSR-17 工厂类 finalPHP7 类型提示移除 PHP7.2 与全部函数2.0.0RC-12021-04-29stream_get_meta_data 的 url 未设置处理2.0.02021-06-30与 RC-1 完全一致2.1.02021-10-06MalformedUriExceptionCachingStream size 为 null 时返回 null截至 2.1.0日志顶部的 Unreleased 区段为空即暂无未发布的公开变更。8. 实操读懂包内 API 并安全升级到 2.x8.1 包内核心能力速览阅读 README.md 可以快速掌握包内能力全貌。它提供三类核心内容流实现与装饰器位于GuzzleHttp\Psr7命名空间AppendStream顺序拼接多流、BufferStream缓冲流返回hwm高水位元数据、CachingStream对不可 seek 的远程流做 seek 缓存、DroppingStream超限丢数据、FnStream函数表组合流、InflateStreamzlib 解压装饰器、LazyOpenStream惰性打开文件、LimitStream子集切片读取、MultipartStream流式 multipart/form-data、NoSeekStream禁止 seek、PumpStream由 callable 泵数据的只读流。自定义装饰器只需use StreamDecoratorTrait并覆写目标方法需要把 PSR-7 流当 PHP 资源用时可使用StreamWrapper::getResource()。静态工具 APIMessage::toString / bodySummary / rewindBody / parseMessage / parseRequest / parseResponseHeader::parse / normalizeQuery::parse / buildUtils::caselessRemove / copyToStream / copyToString / hash / modifyRequest / readLine / streamFor / tryFopen / uriFor以及MimeType::fromFilename / fromExtension。例如// 从多种输入创建流 $stream GuzzleHttp\Psr7\Utils::streamFor(foo); $stream GuzzleHttp\Psr7\Utils::streamFor(fopen(/path/to/file, r)); // 消息字符串化 $request new GuzzleHttp\Psr7\Request(GET, http://example.com); echo GuzzleHttp\Psr7\Message::toString($request);URI 高级工具Uri::isAbsolute / isNetworkPathReference / isAbsolutePathReference / isRelativePathReference / isSameDocumentReference / isDefaultPort / composeComponents / fromParts / withQueryValue / withQueryValues / withoutQueryValueUriResolver::resolve / removeDotSegments / relativizeUriNormalizer::normalize / isEquivalent。UriResolver::relativize的用法示例$base new Uri(http://example.com/a/b/); echo UriResolver::relativize($base, new Uri(http://example.com/a/b/c)); // 输出 c echo UriResolver::relativize($base, new Uri(http://example.com/a/x/y)); // 输出 ../x/y echo UriResolver::relativize($base, new Uri(http://example.com/a/b/?q)); // 输出 ?q echo UriResolver::relativize($base, new Uri(http://example.org/a/b/)); // 输出 //example.org/a/b/8.2 UriNormalizer 规范化标志位UriNormalizer::normalize(UriInterface $uri, $flags self::PRESERVING_NORMALIZATIONS)接受一个位掩码参数可按需组合下列规范化标志位作用与示例PRESERVING_NORMALIZATIONS默认值仅包含保持语义的规范化CAPITALIZE_PERCENT_ENCODING百分号编码三元组字母统一大写http://example.org/a%c2%b1b→http://example.org/a%C2%B1bDECODE_UNRESERVED_CHARACTERS解码未保留字符的百分号编码http://example.org/%7Eusern%61me/→http://example.org/~username/CONVERT_EMPTY_PATHhttp/https 的路径为空时转为/http://example.org→http://example.org/REMOVE_DEFAULT_HOST移除 scheme 的默认主机仅 file 有 localhostfile://localhost/myfile→file:///myfileREMOVE_DEFAULT_PORT移除默认端口http://example.org:80/→http://example.org/REMOVE_DOT_SEGMENTS移除多余点段http://example.org/../a/b/../c/./d.html→http://example.org/a/c/d.htmlREMOVE_DUPLICATE_SLASHES连续斜杠合并%2F 编码斜杠不处理http://example.org//foo///bar.html→http://example.org/foo/bar.htmlSORT_QUERY_PARAMETERS查询参数按键字母序排序可能改变语义?langenarticlefred→?articlefredlangen8.3 升级到 2.x 的检查清单结合 CHANGELOG 与 README从 1.x 升级到 2.x 时应逐项确认PHP 版本至少 7.2.5建议 PHP 8低于此版本无法安装 2.x函数调用迁移Guzzle\Psr7命名空间下所有全局函数已移除一律改用上表对应的静态方法类不可继承2.x 类均为final如有自定义子类需改为组合或装饰器模式可利用StreamDecoratorTrait异常捕获调整2.1.0 起非法 URI 抛MalformedUriException建议显式捕获以兼容未来行为布尔查询值Query::build输出的布尔值变为1/0依赖true/false的服务端解析需同步核对。如需在项目中使用该库仅需通过 Composer 引入guzzlehttp/psr7本仓库的 vendor 树中已有安装实例并确保满足其 PHP 与psr/http-message、psr/http-factory、ralouphie/getallheaders的版本约束实际源码可继续在 service/php/vendor/guzzlehttp/psr7/src 目录中按需查阅例如MalformedUriException在 src/Uri.php 的 URI 解析逻辑中即可找到引用。对于仅将本仓库 PHP 服务作为验证码后端使用的开发者直接跟随 service/php/readme.md 的安装流程即可无需手动改动该依赖的任何文件。赞分享后端应用安全图像处理【免费下载链接】captcha行为验证码(滑动拼图、点选文字)前后端(java)交互包含h5/Android/IOS/flutter/uni-app的源码和实现项目地址https://gitcode.com/gh_mirrors/captc/captcha点击查看免费下载相关推荐ShowDoc 中的 GuzzleHttp PSR-7从 1.0 到 1.9.1 的版本演进与关键变更全解析ShowDoc 中的 GuzzleHttp PSR 7从 1.0 到 1.9.1 的版本演进与关键变更全解析 导读 本文以 ShowDoc 仓库中锁定依赖的文档知识库后端前端OpenCart 随附的 guzzlehttp/psr7PSR-7 消息与流式处理实现完全指南OpenCart 随附的 guzzlehttp/psr7PSR 7 消息与流式处理实现完全指南 导读 本指南以 OpenCart 仓库内随附的第三方库 guz电商后端深度解读 guzzlehttp/psr7 CHANGELOG从 1.0 到 3.0 的安全加固、API 演进与升级路径深度解读 guzzlehttp/psr7 CHANGELOG从 1.0 到 3.0 的安全加固、API 演进与升级路径 本文以 CHANGELOG.md ht后端上一篇TuxGuitar吉他谱编辑从入门到进阶一份免费开源六线谱软件的完整实操指南下一篇把SEI裂纹参数从经验值变成实测值PyBaMM参数校验的完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表