LoginSignup
2
2

More than 5 years have passed since last update.

Laravelプロジェクトから別のLaravelプロジェクトのartisanコマンドをたたくと.envが勝手に実行元のがそのまま使われる

Last updated at Posted at 2018-05-22

概要

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

その他見てたもの

LaravelBでキャッシュクリアしても同じものが作られるだけだった

// 実行後停止してしまう
$this->artisan("config:cache");
Artisan::call("config:cache");

// 後続タスクも動くが同じファイルが作られる
exec("php /var/hoge/LaravelB/artisan config:cache", $output, $return);

いい対応方法があれば知りたい。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2