Composer 不支持自动管理 cron 任务,它仅是依赖管理工具;scripts 只是命令别名,不会写入系统 crontab;第三方库如 cron/cron 仍需手动配置系统级 cron 入口。

不支持。Composer 本身不管理、不写入、不读取系统级 cron 表,它只是一个依赖安装与脚本调度工具,所有“自动执行定时任务”的错觉都来自外部调用或第三方库封装。
composer.json 的 scripts 不会自动注册到系统 cron
很多人误以为在 composer.json 里写个 "scripts": { "schedule:backup": "php backup.php" },再跑一次 composer install,系统就会自动加一条 cron 条目——这是完全错误的。
-
scripts只是命令别名,只在你手动运行composer run schedule:backup时才执行 - 它不会修改
/etc/crontab或调用crontab -e - 即使配上
post-update-cmd,也只在composer update成功后触发一次,不是周期性调度 - 脚本默认不加载项目 autoloader,
php backup.php若依赖vendor/autoload.php,大概率报Class not found
真正能“配置 cron”的是 cron/cron 或 ibexa/cron 这类第三方库
它们提供 PHP 层的调度定义能力,但依然需要你手动配置系统级 cron 入口——Composer 只负责把包拉下来,不负责写 crontab。
-
composer require cron/cron后,你要自己写一个cron.php,里面用\Cron\Cron加载任务并run() - 然后必须手动执行
crontab -e,添加:* * * * * /usr/bin/php /path/to/cron.php > /dev/null 2>&1 -
ibexa/cron同理:装完只是多了ibexa:cron:run命令,仍需你在系统 crontab 里加一行调用它 - 这些库本质是“把 crontab 规则从服务器文件移到 PHP 代码里”,但执行权始终在系统 cron 手中
想让 Composer “参与” cron 配置,只能靠自定义脚本 + 外部命令
如果你真需要在 composer install 后自动写 crontab(仅限可控环境,如 Docker 构建、私有服务器),得自己写 PHP 脚本,并显式调用 crontab 命令——但这和 Composer 无关,只是借用了它的钩子时机。
- 在
post-install-cmd或post-update-cmd中调用一个 PHP 文件,比如:php scripts/setup-cron.php - 该 PHP 文件里用
exec("crontab -l | grep -v 'myproject' | crontab -")清旧条目,再用exec("(crontab -l ; echo '* * * * * cd /app && php artisan schedule:run') | crontab -")写新条目 - 必须确保运行用户有
crontab权限,且crontab命令在$PATH中(不能只依赖 shell 环境变量) - 绝对不要在共享主机、容器无特权模式、或 CI/CD 中这么做——权限和路径不可控,极易失败
真正容易被忽略的一点:无论用哪个库,只要没在系统 crontab 里配那条“每分钟拉一次”的入口,PHP 层定义的所有定时逻辑就等于没写。Composer 只管“装包”,不管“开机自启”。


















