heroku检测到composer.json会自动运行composer install --no-dev --prefer-dist --optimize-autoloader;需确保composer.json和composer.lock在根目录且已提交,php版本兼容,procfile正确声明web入口,并通过heroku config:set管理环境变量。

Heroku检测到composer.json就会自动运行composer install
没错,Heroku原生支持PHP和Composer,只要你的项目根目录存在composer.json,它在部署时就会触发依赖安装流程。不需要额外配置Buildpack(除非你用的是极老版本或自定义PHP环境),也不需要手动上传vendor/目录——这反而会引发冲突或被忽略。
常见错误现象:推送后日志里没看到Installing dependencies,或者报错No compatible version found。通常是因为:composer.json不在Git仓库根目录;文件被.gitignore误排除;或者composer.lock缺失且require中写了无法解析的版本约束(比如"php": ">=8.5"但Heroku当前默认PHP版本是8.3)。
- 确保
composer.json和composer.lock都已提交进Git(git add composer.* && git commit) - 不要在
composer.json中写死PHP版本高于Heroku当前支持的版本(查当前支持列表用heroku buildpacks:versions php) - 如果项目用了
public/作为Web根目录,记得配Procfile:web: vendor/bin/heroku-php-apache2 public/
composer install --no-dev --optimize-autoloader 是默认行为
Heroku部署时实际执行的是composer install --no-dev --prefer-dist --optimize-autoloader,这意味着它跳过require-dev里的包(比如PHPUnit、phpunit/phpunit),只装生产依赖,并生成优化后的自动加载映射。这个行为不能关闭,也不建议绕过。
如果你发现本地能跑、线上报Class not found,大概率是autoload配置问题,而不是依赖没装上。检查composer.json里的autoload字段是否匹配实际目录结构,比如"App\": "src/"但类文件实际在app/下,就会失效。
-
composer dump-autoload -o本地运行一次,再提交vendor/autoload.php相关变更(虽然该文件不提交,但验证逻辑有用) - 部署后可通过
heroku run bash进入容器,执行ls -l vendor/autoload.php确认文件存在 - 避免在
autoload里混用psr-4和classmap,优先用PSR-4并保证命名空间与路径严格一致
环境变量必须通过heroku config:set注入,不能靠.env文件
.env文件本身不会被上传(也**不该**提交),Heroku根本不读它。所有配置项——数据库连接串、API密钥、APP_ENV——都得用heroku config:set KEY=VALUE设置。代码里用getenv('DB_HOST')或$_ENV['DB_HOST']读取,而不是靠vlucas/phpdotenv自动加载。
典型坑点:本地用Dotenv::createImmutable(__DIR__)->load(),上线后getenv()返回false导致连接失败。Laravel/Symfony等框架默认已适配Heroku环境变量,但自研项目容易忽略这点。
- 敏感值(如
DB_PASSWORD)绝对不要写进composer.json或代码里 - 设置后用
heroku config确认是否生效,注意大小写(APP_ENV≠app_env) - 如果框架依赖
APP_DEBUG=true,务必在生产环境设为false,否则暴露敏感信息
Procfile不是可选,而是控制Web服务器入口的关键
没有Procfile,Heroku会尝试用默认规则启动,比如找index.php在根目录。但现代PHP项目几乎都把Web入口放在public/下,这时必须显式声明启动命令,否则404或直接暴露源码。
示例Procfile内容:web: vendor/bin/heroku-php-apache2 public/。注意路径是相对于项目根目录的,不是vendor/内部路径。如果用了Nginx或自定义PHP-FPM,就得换对应命令,但Apache2是Heroku PHP Buildpack默认提供的最简方案。
-
Procfile必须叫这个名字,全部小写,无扩展名,放在Git仓库根目录 - 命令里不能用
./vendor/bin/...,必须用vendor/bin/...(Heroku运行时PWD是项目根) - 改完
Procfile要重新git add && git commit,否则推送不生效
部署真正卡住的地方,往往不是Composer本身,而是autoload路径错、Procfile路径错、或者环境变量漏设——这些错误在日志里通常只显示“Application error”或空白页面,得挨个验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











