Laravel 5.2 .env иногда не загружается вовремя
Я читаю некоторые настраиваемые из моего.env файла. Эти настраиваемые параметры используются в разных местах проекта. Несколько раз я получал исключение, что одна из переменных env не существует. Пример:
ini_set(): It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function.
В моем.env у меня есть это:
TIMEZONE=Africa/Johannesburg
В функции загрузки моего AppServiceProvider у меня есть:
ini_set('date.timezone', getenv('TIMEZONE'));
Это как если бы.env не загружался в то время, когда я пытаюсь использовать одну из его переменных? Я видел, как это происходило с несколькими разными переменными.env на разных этапах работы приложения.
редактировать
Мне известно об использовании config для установки часового пояса, но в данном конкретном случае я должен использовать файл.env, так как у нас есть команда разработчиков, отвечающая за то, на какие серверы мы указываем + нам нужна поддержка отработки отказа, которая не требует вмешательство разработчика просто чтобы указать на другой сервер. Поэтому мне нужно знать, почему у Laravel, похоже, есть проблема с загрузкой.env "вовремя" вместо обходных путей.
2 ответа
В том же проекте мы недавно начали выполнять несколько параллельных запросов AJAX. Проблема проявлялась в 10 раз, но в то же время заставляла меня думать с другой стороны. Затем я прогуглил "Ошибка нескольких запросов AJAX в Laravel" и обнаружил следующее: Laravel 5 теряет сеансы и значения конфигурации.env в приложениях, интенсивно использующих AJAX
Увидев это, я понял, что у меня точно такая же проблема. Это не факт, что я использую.env в качестве "настраиваемого", на самом деле это две проблемы, которые похожи, но имеют одну и ту же проблему: доступ на чтение / блокировку файла. Мои сеансы также работали, потому что у нас нет доступа к БД в нашем приложении, поэтому мы сильно зависим от хранения и извлечения данных из переменных сеансов (файловая система). Хотя я не уверен, что проблема связана с блокировкой файлов.
Я часто использую getenv () в своем приложении, и простой HTTP-вызов иногда может завершиться ошибкой, если одновременно выполняется AJAX-запрос, так как.env оказывается в заблокированном состоянии, я полагаю.
Мое решение состояло в том, чтобы создать синглтон, который запускается в моем AppServiceProvider, и сохранять данные.env И мои данные сеанса в объектах (памяти). Моя теория заключалась в том, что, как только файл был открыт / закрыт, даже если запрос все еще был занят и в файл поступил другой HTTP-запрос, он уже был бы закрыт. С этого момента я получаю доступ ко всем моим переменным.env и данным сеанса из синглтона. Теперь в редких случаях проблема все еще появляется.
Следующая проблема, в которой я уверен, возникнет, когда у нас будет слишком много одновременных пользователей, загружающих.env, но тогда я с этим разберусь.
Обновить
Я решил написать свой собственный скрипт, который открывает и читает содержимое.env. Ни единой проблемы с тех пор... Так, как подчеркивалось в моем связанном посте, PHP dotenv от Lance Vucas, похоже, имеет проблемы с тяжелыми AJAX-проектами. Это может быть основной проблемой PHP, которая влияет на этот плагин.
Я также никогда ничего не менял для моих очевидных проблем сессий, и после реализации моего собственного сценария проблема сессий также исчезла...
Это не совсем ошибка Laravel.
Вы должны установить по умолчанию date.timezone
в вашем файле php.ini это позаботится о вашем предупреждении.
Кроме того, вместо ini_set в вашем AppServiceProvider, используйте
'timezone' => env('TIMEZONE', '[whatever default value you want]'),
в config/app.php