
本文详解 laravel 应用在 heroku 平台上的标准化部署流程,涵盖环境变量注入、artisan 命令缓存、数据库 url 解析、静态资源构建等关键环节,解决“application error”“artisan not found”“connection refused”等高频失败问题。
本文详解 laravel 应用在 heroku 平台上的标准化部署流程,涵盖环境变量注入、artisan 命令缓存、数据库 url 解析、静态资源构建等关键环节,解决“application error”“artisan not found”“connection refused”等高频失败问题。
将 Laravel 项目成功部署至 Heroku 并稳定运行,远不止 git push heroku main 这一步。许多开发者遭遇“Application error”、白屏、500 错误或日志中反复出现 bash: artisan: command not found,其根源往往在于 Heroku 的构建机制与 Laravel 生产启动链存在天然断层——Heroku 不会自动执行 php artisan config:cache,也不会解析 .env 中的 DATABASE_URL,更不会触发前端资源编译。以下为经过生产验证的全流程解决方案。
✅ 一、强制执行 Artisan 缓存命令(核心修复)
Laravel 的 public/index.php 在加载 bootstrap/app.php 时,若未提前缓存配置,会因环境变量缺失而直接 fatal error。必须在 Composer 安装后立即执行缓存命令。修改项目根目录下的 composer.json,在 "scripts" 字段中添加或覆盖 "post-install-cmd":
"scripts": {
"post-install-cmd": [
"@php artisan optimize:clear",
"@php artisan config:cache",
"@php artisan route:cache",
"@php artisan view:cache"
]
}
⚠️ 注意事项:
-
optimize:clear是必需前置步骤,用于清除 Heroku 构建缓存中可能残留的旧bootstrap/cache/文件; - 所有
artisan命令必须加@php前缀(如@php artisan config:cache),否则 Heroku 的 Composer 环境无法定位可执行文件; -
禁止在
Procfile中写web: php artisan serve—— Heroku PHP Buildpack 自带 Nginx + PHP-FPM,仅认public/目录为 Web 根路径。
✅ 二、正确对接 Heroku 数据库(PostgreSQL)
Heroku 默认提供 PostgreSQL,并通过 DATABASE_URL 环境变量注入(形如 postgres://user:pass@ec2-xx.compute-1.amazonaws.com:5432/dbname)。Laravel 默认不识别该变量,需显式启用解析能力:
方案 A(推荐,Laravel ≥ 9.2):
在 .env 中设置:
DATABASE_URL=postgres://...
然后打开 config/database.php,找到 pgsql 配置块,取消注释以下行(默认被注释):
'url' => env('DATABASE_URL'),
其余 DB_HOST、DB_PORT 等字段可全部删除或留空,Laravel 将自动从 DATABASE_URL 提取。
方案 B(兼容旧版):
在 bootstrap/app.php 文件最顶部($app = new Illuminate\Foundation\Application(...) 之前)插入解析逻辑:
if ($url = getenv('DATABASE_URL')) {
$parsed = parse_url($url);
putenv("DB_CONNECTION=pgsql");
putenv("DB_HOST={$parsed['host']}");
putenv("DB_PORT={$parsed['port']}");
putenv("DB_DATABASE=" . ltrim($parsed['path'], '/'));
putenv("DB_USERNAME={$parsed['user']}");
putenv("DB_PASSWORD={$parsed['pass']}");
}
❌ 绝对禁止在 .env 中硬编码 DB_HOST=127.0.0.1 —— Heroku dyno 不允许本地回环连接,且每次重启 IP 动态变化。
✅ 三、确保前端资源正常构建
CSS/JS 404 或样式失效,通常因 npm run production 未在构建阶段执行。Heroku 支持 heroku-postbuild 生命周期脚本:
在 package.json 中添加:
"scripts": {
"heroku-postbuild": "npm run production"
}
同时确认 webpack.mix.js 或 vite.config.js 输出路径为 public/ 下的标准位置(如 public/css/app.css, public/js/app.js),并已在 Blade 模板中正确引用(使用 asset() 辅助函数)。
✅ 四、环境变量安全注入(APP_KEY 等关键项)
Heroku 不读取 .env 文件,所有敏感配置必须通过 CLI 注入:
heroku config:set APP_KEY=$(php -r "echo base64_encode(random_bytes(32));") heroku config:set APP_DEBUG=false heroku config:set LOG_CHANNEL=errorlog
其他如 MAIL_MAILER, REDIS_URL 等也应同理设置。可通过 heroku config 查看已配置项。
✅ 五、验证与排错
部署后若仍异常,按顺序排查:
- 查看实时日志:
heroku logs --tail; - 进入 dyno 调试:
heroku run bash,手动执行php artisan config:cache观察报错; - 检查
public/目录结构是否完整(尤其index.php是否存在且权限正常); - 确认
composer install无警告,vendor/autoload.php可被正确加载。
遵循以上五步,99% 的 Laravel Heroku 部署失败问题均可定位并解决。关键在于理解 Heroku 的无状态、声明式构建模型,并主动补全 Laravel 生产环境所依赖的初始化链条——而非依赖本地开发习惯。











