2015-09-30 2 views
3

У меня есть два API-интерфейса Laravel, которые обслуживают приложение AngularJS на моей локальной машине разработки. Я получаю странную проблему, когда Угловая страница вызывает POST для обоих API, где, похоже, используется неправильное имя базы данных (она использует другую базу данных экземпляра Laravel). Laravel выдает исключение, в котором говорится, что Table database.table не найден, где база данных является неправильной базой данных. Я пробовал вызывать каждый из API, используя Postman, и это работает отлично, и я уверен, что нет упоминания о другой базе данных в любом проекте.Weird Laravel 5 кеширование с использованием неправильного имени базы данных

Для меня это похоже на проблему кэширования, где по какой-либо причине файл .env может быть кэширован и разделен между двумя серверами Laravel. Оба приложения Laravel размещаются на Apache. Я попытался позвонить php artisan config:clear и установить соответствующие заголовки в файлах .htaccess, чтобы попытаться предотвратить кеширование, но ни один из них не работал. Я также пробовал несколько браузеров, очистил кеш и по-прежнему ту же ошибку.

Я хочу, чтобы иметь возможность использовать файл .env, чтобы иметь уникальную конфигурацию для моего сервера разработки, поэтому я бы предпочел не жестко кодировать учетные данные базы данных в config/database.php. Любые идеи, что может быть проблемой?

Оба database.php файлов выглядеть следующим образом:

'mysql' => [ 
'driver' => 'mysql', 
'host'  => env('DB_HOST'), 
'database' => env('DB_DATABASE'), 
'username' => env('DB_USERNAME'), 
'password' => env('DB_PASSWORD'), 
'charset' => 'utf8', 
'collation' => 'utf8_unicode_ci', 
'prefix' => '', 
'strict' => false, 
], 

Где уникальные настройки хранятся в .env

+0

'.env' находится в корневом каталоге вашего проекта, а не в каталоге' app/'. – sebdesign

+0

К сожалению, это была опечатка. – Gabriel

+0

Я все еще не решил это, но, как временное решение, теперь я просто определяю учетные данные базы данных в app/config/database.php на основе значения env ('APP_ENV') вместо того, чтобы хранить файлы в .env-файле – Gabriel

ответ

1

У меня точно такая же проблема. Одна веб-страница будет запрашивать 5 ответов json с разными наборами данных из laravel и около половины запросов будет бомбить с ошибкой «неправильной базы данных», даже если при повторной загрузке этих точных запросов на их вкладке браузера они работают нормально. Похоже, ошибка Laravel связана с обработкой одновременных веб-запросов от apache.

Во всяком случае, моим обходным решением было жесткое кодирование хоста, db, username и пароля для всех подключений в моем файле config \ database.php, и теперь мои запросы json больше не боятся. Однако отпадает необходимость жестко закодировать пароли в исходный контроль и работать с несколькими средами - по существу, возвращаясь к темным временам до того, как существовали файлы .env.

4

У меня возникла такая же проблема, и в моем случае она была вызвана выпуском toddbc на https://github.com/vlucas/phpdotenv/issues/76.

Laravel полагается на vlucas/phpdotenv, который использует PHP putenv() для добавления значений из файла .env, чтобы они были доступны вашему приложению. Тем не менее,

putenv() и getenv() не обязательны для повторного ввода или защиты резьбы. Это означает, что если два потока могут вызвать их одновременно (либо на разных ядрах, либо из контекстного переключателя в середине функции), могут возникнуть плохие вещи.

Таким образом, два экземпляра PHP (в моем случае из разных приложений) смогли прочитать переменные среды, принадлежащие друг другу во время запросов concurrrent.

Как vlucas поясняет в своем ответе на отчет о проблеме, это ожидаемое поведение, и решение заключается в определении ваших переменных окружения в файле конфигурации веб-сервера.

То, что сработало для меня, чтобы удалить DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD строки из моего .env файла и добавьте следующие строки в моем Apache ВХост конфигурации блока:

SetEnv DB_HOST db_host 
SetEnv DB_DATABASE db_name 
SetEnv DB_USERNAME db_user 
SetEnv DB_PASSWORD db_pass 

(Не забудьте перезапустить Apache после изменения конфигурации)

Обратите внимание, что если у вас есть одно приложение Laravel в вашем корневом веб-браузере и дополнительное приложение Laravel, установленное в подкаталоге, использующем директиву Apache Alias ​​для маршрутизации запросов в нужное приложение, вам нужно будет использоватьдля ОБА наборов учетных данных базы данных, например, так:

# Laravel app 1 in web root 
SetEnvIf Host ".*" DB_HOST=db1_host 
SetEnvIf Host ".*" DB_DATABASE=db1_name 
SetEnvIf Host ".*" DB_USERNAME=db1_user 
SetEnvIf Host ".*" DB_PASSWORD=db1_pass 

# Laravel app 2 in subdirectory "/subdir" 
SetEnvIf Request_URI ^/subdir DB_HOST=db2_host 
SetEnvIf Request_URI ^/subdir DB_DATABASE=db2_name 
SetEnvIf Request_URI ^/subdir DB_USERNAME=db2_user 
SetEnvIf Request_URI ^/subdir DB_PASSWORD=db2_pass 

(Для объяснения того, почему вы не можете использовать комбинацию SetEnv и SetEnvIf, см https://staff.washington.edu/fmf/2013/04/24/using-setenv-and-setenvif-together-in-apache/)

Хорошая вещь об этом решение (если оно работает для вас) заключается в том, что его необходимо реализовать только в тех средах, где проявляется проблема, то есть, если это влияет только на локальную среду dev, тогда на вашем производственном сервере ничего не нужно изменять.

3

То, что сработало для меня было, чтобы очистить кучу настроек Laravel, выполнив следующие команды:

php artisan config:clear 
php artisan cache:clear 
php artisan route:clear 
php artisan view:clear 
php artisan optimize 

Я не уверен, команда сделала это, но Laravel теперь распознает/считывает файл .env правильно для моей конфигурации базы данных.

+0

Спасибо - попробовал первый (config: clear), и он сработал. Я считаю, что остальное может быть ненужным. –

+0

У меня была die() в моей config/database.php, и она не была вызвана - после того, как я выполнил «php artisan config: clear», она была вызвана (короче, это сработало для меня) –

1

Старого вопрос, но только в том случае, если кто-то считает, что это происходит с ними (как только что случилось со мной) моим простым решением было изменить имена переменных .env в одном из проектов:

DB_X_HOST="localhost" 
DB_X_DATABASE="other_project" 
DB_X_USERNAME="homestead" 
DB_X_PASSWORD="secret" 
DB_X_PORT="3306" 

вы измените переменные в конфигурации \ database.php следующим образом:

'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_X_HOST', '127.0.0.1'), 
     'port' => env('DB_X_PORT', '3306'), 
     'database' => env('DB_X_DATABASE', 'forge'), 
     'username' => env('DB_X_USERNAME', 'forge'), 
     'password' => env('DB_X_PASSWORD', ''), 
     'charset' => 'utf8mb4', 
     'collation' => 'utf8mb4_unicode_ci', 
     'prefix' => '', 
     'strict' => true, 
     'engine' => null, 
    ] 

Теперь вы не должны иметь перекрестное загрязнение подробно в ответ Марка

1

ГЭЭ ver restart with php artisan serve У меня такая же проблема

Смежные вопросы