In a PHP / Drupal project I'm encountering a problem when using Drush in a Heroku instance. The environment variable DATABASE_URL
in the settings.php
file is not recognized by Drush.
However, when I use the command heroku config -a my-app -s
the DATABASE_URL
is visible. Same with phpinfo()
.
I try to use Procfile
like:
web: export DATABASE_URL=$DATABASE_URL && heroku-php-apache2 web/
but that doesn't work, either.
The only way to get Drush to recognize the variable is to execute export DATABASE_URL="mysql://..."
when I am on the instance, but it's not persistent:
heroku ps:exec -a my-app
export DATABASE_URL="mysql://..."
drush status
Any suggestions?
settings.php
:
$db_cred = parse_url(getenv('DATABASE_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/',
);
The SSH session created by Heroku Exec doesn’t have the config vars set as environment variables (i.e.,
env
in a session doesn’t list config vars set byheroku config:set
).
I suggest you connect using heroku run
instead:
heroku run bash -a my-app
drush status
The main difference between heroku ps:exec
and heroku run
is that the former connects to a running dyno and the latter spins up a one-off dyno.
You should also roll back that change to your Procfile
. There's no point in re-exporting an environment variable like that, and it may be confusing later.
Finally, note that the value of DATABASE_URL
can change at any time. Even if you were able to export its current value in a persistent way, that connection string might not work tomorrow. It's better to read the variable every time.
Side note: It doesn't look like drush status
is a valid command. I'm not a Drupal guy so can't help much beyond pointing that out. Maybe you're looking for core:status
, config:status
, or another similarly-named command?