php默认不原生支持zstd解压,需手动安装启用ext-zstd扩展(php≥8.1且libzstd≥1.4.0),否则curl等获取的zstd响应会被当二进制流处理导致json_decode失败。

Composer 的 packages.json 索引文件(如 https://packagist.org/packages.json)默认用 gzip 压缩,但越来越多镜像站开始支持 zstd。实际效果不是“zstd 更好”就能一锤定音——关键看你的 PHP 进程是否真能解压它。
PHP 是否原生支持 zstd 解压?
绝大多数生产环境的 PHP(包括 8.0/8.1/8.2)默认不带 zstd 扩展,curl 或 file_get_contents() 拿到 zstd 压缩的响应体后,只会当普通二进制流处理,导致 json_decode() 失败或报错 JSON_ERROR_SYNTAX。
- 必须显式安装并启用
ext-zstd(PHP ≥ 8.1),且依赖系统有libzstd≥ 1.4.0 -
composer install本身不走 PHP 解压逻辑,而是调用系统zstd -d—— 所以 CLI 场景下只要command -v zstd成功即可 - Web 场景(如自建镜像服务返回
Content-Encoding: zstd)必须确保php-fpm进程加载了zstd扩展,否则 Nginx/Apache 收到压缩体也无法透传给 PHP
Composer 客户端对压缩算法的实际协商逻辑
Composer 并不主动声明 Accept-Encoding: zstd,它依赖底层 HTTP 客户端(ext-curl 或 ext-http)的能力。即使服务端返回 zstd 响应,若客户端未在请求头中声明支持,就会被忽略。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 默认只发
Accept-Encoding: gzip(见src/Composer/Util/RemoteFilesystem.php) - 要启用
zstd,需手动 patch 或通过插件注入头:在composer.json中加"extra": {"http": {"options": {"headers": ["Accept-Encoding: gzip, zstd"]}}}(仅限部分版本支持) - 更稳妥的做法是让镜像服务对
User-Agent: Composer/*自动 fallback 到gzip,避免客户端兼容问题
索引文件场景下 zstd 的真实收益边界
以 Packagist 主站 packages.json(约 70MB 原始 JSON)为例:gzip -9 压到 ~12MB,zstd -T0 -12 压到 ~10.3MB —— 体积只少 1.7MB,但解压耗时从 180ms 降至 65ms(实测 PHP 8.2 + ext-zstd)。收益集中在“高频读取+低延迟敏感”场景。
- CI 构建中频繁
composer update:zstd 解压快可节省单次 100ms+,积少成多 - 镜像代理服务(如 Toran Proxy 替代品):CPU 解压压力下降明显,尤其并发 >50 QPS 时
- 但若只是本地开发偶尔
install,gzip 足够;强行上 zstd 反而增加部署复杂度 - 注意:Composer v2.5+ 开始实验性支持
zstd,但未设为默认,因生态兼容仍是硬门槛
真正卡点不在压缩率,而在解压链路是否闭环——你得确认从 HTTP 客户端、到 PHP 扩展、再到 Composer 运行时,每层都认得 zstd 这个编码名,否则它就只是个无法打开的压缩包。










