Я использую Laravel 5.0.33 и у меня есть следующие папки на моем сервере:
/var/www/laravel_dev/
/var/www/laravel_stage/
/var/www/laravel_production/
Каждый из них имеет свой собственный файл .env и базу данных, но по какой-то причине каждый из них иногда загружает неправильный файл .env (как, например, каждый сотый запрос).
Я подумал, что он загружает неправильный файл .env, потому что, когда я выгружаю базу данных env:
var_dump(env('DB_DATABSE'));
Иногда он возвращает имя базы данных laravel_production на сайте laravel_dev.
Я выполнил поиск по имени базы данных laravel_production, но его нет в папке dev.
У меня есть triede, чтобы сбросить константу dir (DIR) разные места, это всегда правильно.
У кого-нибудь есть идея, что может быть не так, или как я могу еще глубже понять, что может быть не так?
Я недавно столкнулся с этой проблемой, и хотел поделиться тем, что я узнал здесь, так как это один из лучших результатов поиска Bing / Google.
Скорее всего, если вы столкнетесь с этим, вы работаете на многопоточном веб-сервере, и это не было проблемой, пока несколько человек не попали на сервер.
Короче говоря, использование пакета dotenv, который использует Laravel, не безопасен для потоков. Вы можете увидеть обсуждение этого здесь:
https://github.com/vlucas/phpdotenv/issues/76
Быстрое решение заключается в запуске:
artisan config:cache
И я настоятельно рекомендую добавить строку комментария в начало вашего файла .env:
# IMPORTANT! If you change ANYTHING in here make sure to run > artisan config:cache
Надеюсь, это поможет.
Оказывается, что dotevn предназначен только для разработки экземпляров проекта. В производстве файлы конфигурации должны быть жестко закодированы.
https://github.com/vlucas/phpdotenv
«phpdotenv создан для сред разработки и, как правило, не должен использоваться в рабочей среде. В рабочей среде фактические переменные среды должны быть установлены таким образом, чтобы при каждом запросе не требовалось загружать файл .env».
Я использую git на производственном экземпляре, поэтому мое решение проблемы — установить переменные среды в каждом файле vhost для каждого экземпляра, который мне нужен на сервере:
SetEnv DB_DATABASE laravel_stage
SetEnv CACHE_PREFIX stage
Работает как шарм.