Heroku环境中Drush无法识别DATABASE_URL环境变量求助
解决方案
方案1:执行Drush命令时直接注入环境变量
每次通过heroku run执行Drush时,将DATABASE_URL直接传入进程环境:
heroku run "DATABASE_URL=$(heroku config:get DATABASE_URL -a my-app) drush <你的Drush命令>" -a my-app
示例(清除缓存):
heroku run "DATABASE_URL=$(heroku config:get DATABASE_URL -a my-app) drush cr" -a my-app
方案2:配置Drush别名文件
在项目的drush/sites目录(不存在则创建)下创建self.site.yml,直接写入数据库配置信息:
prod: root: /app/web uri: https://<你的应用域名>.herokuapp.com database: default: default: database: '<从DATABASE_URL提取的数据库名>' username: '<数据库用户名>' password: '<数据库密码>' host: '<数据库主机地址>' port: '<端口号>' driver: mysql isolation_level: 'READ COMMITTED'
后续执行Drush时指定别名:
heroku run drush @prod <你的命令>
注:数据库信息可从heroku config:get DATABASE_URL -a my-app的结果中解析,比如mysql://user:pass@host:port/dbname对应各字段即可。
方案3:编写Drush启动脚本
在项目根目录创建drush-launch.sh脚本:
#!/bin/bash # 从Heroku配置获取DATABASE_URL并注入环境 export DATABASE_URL=$(heroku config:get DATABASE_URL -a my-app) # 执行传入的Drush命令 exec drush "$@"
给脚本添加执行权限并部署:
git add drush-launch.sh git update-index --chmod=+x drush-launch.sh git commit -m "Add Drush launch script for Heroku" git push heroku main
之后使用脚本执行Drush命令:
heroku run ./drush-launch.sh <你的命令>
方案4:修改settings.php兼容Drush环境
在settings.php中添加 fallback 逻辑,当环境变量获取失败时,尝试读取Drush命令行参数:
$db_url = getenv('DATABASE_URL'); // 若环境变量不存在,尝试读取Drush的--db-url参数 if (!$db_url && function_exists('drush_get_option')) { $db_url = drush_get_option('db-url'); } if ($db_url) { $db_cred = parse_url($db_url); $databases['default']['default'] = array ( 'database' => ltrim($db_cred['path'], '/'), 'username' => $db_cred['user'], 'password' => $db_cred['pass'], 'prefix' => '', 'host' => $db_cred['host'], 'port' => $db_cred['port'], 'isolation_level' => 'READ COMMITTED', 'namespace' => 'Drupal\mysql\Driver\Database\mysql', 'driver' => $db_cred['scheme'], 'autoload' => 'core/modules/mysql/src/Driver/Database/mysql/', ); }
执行Drush时手动传递参数:
heroku run drush <命令> --db-url=$(heroku config:get DATABASE_URL -a my-app)
内容的提问来源于stack exchange,提问作者florian_drupal
相关产品推荐
相关产品推荐

