Composer audit 无内置定时机制,需通过 cron 等外部调度配合显式调用、正确项目路径、环境配置及 auth.json 凭证才能稳定运行,并依赖定期更新 composer.lock 以确保漏洞检测时效性。

Composer 本身不提供内置的定时任务机制,composer audit 也不能自动“定期运行”——它只是单次执行的安全检查命令。想实现“自动检查安全漏洞并定期运行”,必须靠外部调度(如 cron)+ 显式调用 + 合理配置项目上下文。
为什么 composer audit 在 CI 或定时脚本里常失败?
常见原因是没进对项目目录、没加载正确的 Composer 配置、或用了全局安装的 Composer 而非项目本地二进制。
-
composer audit默认只检查当前目录下的composer.lock,不在项目根目录下执行会报错No composer.lock file found - 如果项目用了
platform-check或自定义security-advisories源,但未在composer.json中声明"minimum-stability": "stable"或启用了"audit": true配置,结果可能漏报 - 某些私有包仓库未在
auth.json中预配凭证,audit会卡住或跳过检查
如何让 composer audit 真正跑起来(带项目上下文)
关键不是改 Composer 配置,而是写一个可复用、带路径和环境保障的执行脚本。
- 用绝对路径调用项目内的
composer:比如/var/www/myapp/composer.phar audit --no-interaction --format=json - 务必
cd进项目根目录再执行,或用--working-dir参数指定:php composer.phar audit --working-dir=/var/www/myapp --no-interaction - 加
--no-interaction避免卡在交互提示;加--format=json方便后续解析或告警(比如发现"advisories_count": > 0就发 Slack) - 如果项目依赖私有包,确保
auth.json存在且权限为600,内容类似:{ "http-basic": { "repo.example.com": { "username": "token", "password": "abc123" } } }
用 cron 定期运行的最小可行方案
cron 不懂 PHP 环境变量和工作目录,必须显式设置。
- 编辑用户 crontab:
crontab -e - 添加一行(每天凌晨 3:15 检查):
15 3 * * * cd /var/www/myapp && /usr/bin/php /var/www/myapp/composer.phar audit --no-interaction --format=json > /var/log/composer-audit-$(date +\%F).log 2>&1
- 注意:
cd和&&保证路径正确;/usr/bin/php显式指定 PHP 路径(避免 cron 使用旧版本);日志按日期分割,防止单文件无限增长 - 测试是否生效:手动运行该行命令,检查日志里有没有
"advisories"字段和非空数组
真正容易被忽略的是锁文件时效性——composer audit 只校验 composer.lock 记录的版本,如果开发者长期不运行 composer update,即使漏洞已修复,audit 也不会“自动感知”新版本。定期检查的前提,是项目本身保持依赖更新节奏。










