可用:检查composer命令存在、--version成功、缓存目录可写、主仓库URL返回200。脚本用command -v、timeout、curl -sfI实现轻量健康验证,不依赖diagnose全量输出。

如何用 shell 脚本判断 composer 服务是否健康?
Composer 本身不是常驻服务,没有 systemctl status composer 这种东西——所谓“健康检查”,实际是验证它能否正常执行基础命令、联网、解析包、写入缓存。核心判断逻辑是:能跑 composer --version + 能连通 Packagist(或你配置的私库)+ 缓存目录可写。
常见错误现象:Command 'composer' not found(未安装或不在 $PATH)、Could not open input file: composer.phar(误用 phar 路径)、Connection refused 或超时(网络/代理/私库地址失效)、Permission denied(~/.composer/cache 权限异常)。
- 先确认
composer可执行:用command -v composer检查,别直接which composer(某些 shell 不兼容) - 加
--no-ansi --no-interaction避免交互阻塞和颜色字符干扰输出 - 用
timeout 10s包裹网络操作,防止卡死(尤其私库响应慢时) - 不要依赖
composer diagnose的全部输出——它会扫描项目目录,若当前路径无composer.json可能报错,反而干扰判断
composer diagnose 哪些输出代表真问题?
composer diagnose 是最接近“健康检查”的内置命令,但它默认在当前目录运行,且输出混合了提示、警告、错误。关键只看退出码和特定关键词:
- 退出码非
0:一定有问题(如网络不通、PHP 扩展缺失) - 输出含
Warning但不含ERROR:多数可忽略(例如 “You are running Composer with SSL/TLS protection disabled”),除非你明确禁用了 HTTPS - 输出含
ERROR或Failed to decode JSON:缓存损坏或私库返回非法响应,需清理~/.composer/cache/repo/https---packagist.org/ - 输出含
curl error或file_get_contents(): failed to open stream:网络层失败,检查composer config -g repo.packagist.org.url是否被篡改
私有仓库场景下怎么避免误判?
公司用私库(如 Satis、Private Packagist、Artifactory)时,composer diagnose 默认仍会尝试访问 packagist.org,导致假失败。必须显式切换上下文:
- 临时指定仓库:用
composer config --global repo.packagist.org false关闭官方源,再composer config --global repos.myrepo composer https://my-repo.example.com - 检查私库连通性:用
curl -sfI -o /dev/null -w '%{http_code}' https://my-repo.example.com/packages.json,期望返回200,不是401或000 - 注意认证:如果私库需要 token,确保
auth.json已配置且权限为600(chmod 600 ~/.composer/auth.json),否则diagnose会静默失败 - 避免缓存污染:私库 URL 改变后,旧缓存不会自动失效,得手动
composer clear-cache
一个轻量可靠的检查脚本长什么样?
下面这个脚本不依赖项目上下文,只验证全局 composer 环境,适合集成进监控或 CI:
#!/bin/bash
set -e
<h1>检查命令是否存在</h1><p>if ! command -v composer &> /dev/null; then
echo "ERROR: composer not found in PATH"
exit 1
fi</p><h1>检查版本输出(快速验证 PHP 环境和 phar 完整性)</h1><p>if ! timeout 5s composer --version --no-ansi --no-interaction &> /dev/null; then
echo "ERROR: composer --version failed"
exit 1
fi</p><h1>检查缓存目录可写</h1><p>CACHE_DIR="$(composer config -g cache-dir 2>/dev/null || echo "$HOME/.composer/cache")"
if [[ ! -d "$CACHE_DIR" ]] || [[ ! -w "$CACHE_DIR" ]]; then
echo "ERROR: cache dir $CACHE_DIR not writable"
exit 1
fi</p><h1>检查网络连通性(优先用配置的主仓库)</h1><p>REPO_URL=$(composer config -g repo.packagist.org.url 2>/dev/null | tr -d '"')
if [[ -z "$REPO_URL" ]]; then REPO_URL="<a href="https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19">https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19</a>"; fi
if ! timeout 10s curl -sfI -o /dev/null -w '%{http_code}' "$REPO_URL/packages.json" | grep -q "200"; then
echo "ERROR: cannot reach $REPO_URL"
exit 1
fi</p><p>echo "OK"注意:这个脚本不运行 composer diagnose 全量检查,因为它的部分子检查(如 Git 配置、PHP ini 设置)和“服务健康”无关,反而增加误报概率。真正要盯的是命令执行能力、缓存、网络这三块。


















