概要
LaravelそのものというよりはDotEnv PHPとPHP putenv()の話のようだが、
Laravelプロジェクトから別のLaravelプロジェクトのartisanコマンドをたたくと.envは実行元のが使われてしまう模様
Lumenも同様らしいし、同一サーバーCurlでも同じらしい
自分の環境は
PHP:7.2.4
Laravel:5.6.15
状況
/var/hoge
├LaravelA
│ ├.env
│ ├app
│ ├bootstrap
│ ├config
│ ├public
│ └artisan
└LaravelB
├.env
├app
├bootstrap
├config
├public
└artisan
こんな感じでプロジェクトを二つ作り
LaravelAから
exec("php /var/hoge/LaravelB/artisan foo:bar", $output, $return);
こんな感じで実行すると、artisan foo:barでは完全にLaravelBの環境で動くことが期待されるが、
なぜかLaravelBのコードで、LaravelAの.envを用いて実行される。
なかなか気づかずにLaravelAとBでDBを分けている中で、テーブルが見つからないが出まくり、
bootstrap/cache/config.php のdatabase部分の中身がどう考えても、LaravelBのconfig/database.phpにLaravelAの.envを適用したものだった
メモ
現状はとりあえず変数レベルで上書きし、ごまかし運用
config(['database.connections.pgsql.database' => $dbConfig]);
同一サーバー内のCurlでも起きる模様
https://github.com/laravel/framework/issues/16407
その他見てたもの
- https://github.com/laravel/lumen-framework/issues/605
- https://github.com/laravel/framework/issues/14511
LaravelBでキャッシュクリアしても同じものが作られるだけだった
// 実行後停止してしまう
$this->artisan("config:cache");
Artisan::call("config:cache");
// 後続タスクも動くが同じファイルが作られる
exec("php /var/hoge/LaravelB/artisan config:cache", $output, $return);
いい対応方法があれば知りたい。