答案:composer.phar报PharException或“broken signature”是文件损坏而非过期,需删除重装并校验SHA-384签名。PHP加载时先验签,失败即抛异常,不进入版本检查;常见原因包括下载中断、杀软拦截、换行符污染等,官方安装脚本自带校验,必须使用。

composer.phar 本身没有“过期”概念,只有损坏、签名失效或版本陈旧——但报错时你看到的几乎全是前者,不是后者。
为什么 composer --version 报 PharException 或 “broken signature”
这不是版本老了,是文件在校验环节直接失败。PHP 在加载 composer.phar 时会验证其内嵌的 SHA-384 签名,一旦不匹配就抛 PharException,根本不会进入版本检查逻辑。
- 常见诱因:用
curl下载中途断开、杀毒软件拦截写入、Windows 上换行符污染、php composer-setup.php执行被 Ctrl+C 中断 - 别信“重命名后缀就能用”——
composer.phar是带签名的 PHAR 归档,改名不解决校验失败 - 执行
file $(which composer),如果输出含data而非PHP script, ASCII text,说明文件已截断
Linux/macOS 一步重装并验证签名(必须走这步)
官方安装脚本自带 SHA-384 校验,跳过等于重复踩坑。
- 删旧文件:
sudo rm -f $(which composer) - 下载安装器:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - 校验安装器:
HASH=$(curl -sS https://composer.github.io/installer.sig) && php -r "if (hash_file('sha384', 'composer-setup.php') === '\$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" - 安装:
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer - 清理:
rm composer-setup.php - 验证:
composer --version和composer diagnose都应返回 OK
Windows 用户别碰 .phar 手动安装
Win 平台下用命令行下载/执行 composer-setup.php 极易因 UAC、杀软、CRLF 换行导致文件不完整,且 composer.phar 默认无执行权限。
- 直接去 https://www.php.cn/link/594ca739e3609243a6b6a3dd8d871114 下载
Composer-Setup.exe - 双击运行,它会自动检测 PHP 路径、写入 PATH、注册关联,无需手动 chmod 或移动文件
- 若已装过但出问题,先卸载控制面板里的 Composer,再重装 .exe
确认是不是真要更新版本,而不是修损坏
运行 composer self-update 前,先看当前版本是否低于最新稳定版:
- 查当前版本:
composer --version(如Composer version 2.5.8) - 查官网最新版:
curl -sS https://getcomposer.org/version | grep stable - 若版本落后,且
self-update报Permission denied,说明composer.phar在/usr/local/bin且属 root——别硬加sudo,改用本地安装:php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php --install-dir=. --filename=composer,之后用php composer self-update - 若
self-update报openssl extension is required,说明 PHP CLI 未启用 OpenSSL,不是 Composer 的问题
最常被忽略的一点:所谓“过期”基本是误判,95% 的 PharException 都源于文件不完整,而非版本滞后。校验和重装是唯一直接有效的动作,别在损坏文件上浪费时间尝试修复。


















