У меня есть 2 приложения Laravel на одном сервере. Сервер Apache 2.4, и у меня есть vhosts, настроенные для обслуживания каждого приложения в другом домене.
Первое приложение представляет собой API, и его файл .env настраивается следующим образом:
APP_ENV=production APP_KEY=YYYYYYYYYYYYYYYYYY APP_DEBUG=false APP_LOG_LEVEL=debug APP_URL=https://notify.mysite.com APP_DOMAIN=notify.mysite.com DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=notify DB_USERNAME=YYYYYYYYYYYYYYYYYY DB_PASSWORD=YYYYYYYYYYYYYYYYYY BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync
Второе приложение представляет собой пользовательский интерфейс, который, среди прочего, использует API из первого приложения. Его .env-файл настроен следующим образом:
APP_ENV=local APP_KEY=XXXXXXXXXXXXXX APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=https://asapps.mysite.com APP_DOMAIN=asapps.mysite.com APP_VERSION=1 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=asapps DB_NOTIFY_DATABASE=notify DB_FLIGHT_DATABASE=flights DB_USERNAME=XXXXXXXXXXXXXX DB_PASSWORD=XXXXXXXXXXXXXX BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync
Я могу отправлять сообщения в свой API из моего редактора Swagger, из Postman и с других серверов, и все работает так, как ожидалось.
Мое второе приложение само по себе также работает так, как ожидалось.
Однако, если мое второе приложение отправляет запрос API, приложение API вызывает эту ошибку:
исключение «PDOException» с сообщением «SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146« asapps.preprocessor_config »не существует» в C: \ notify \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection .php: 332
WTH?
База данных для API установлена в DB_DATABASE = уведомлять и определенно правильно использует это соединение при отправке сообщений с других серверов. Так почему же он пытается использовать соединение с базой данных второго приложения, когда я вызываю API из этого приложения ??? Его почти так же, как он кэширует соединение с БД и пытается использовать тот же самый … Как это остановить?
Таблица «asapps.preprocessor_config» не существует »
После более копания (читайте безумный поход) я нашел проблему и решение здесь
В нижней строке, когда сайт A принимает запрос, php загружает переменные .env для всей длины HTTP-запроса. Во время этого запроса, когда сайт A вызывает сайт B, поскольку они находятся на том же сервере, на котором работает тот же php, php все еще использует .env с сайта A и отдельно не загружает файл .env сайта B.
Лучшее объяснение автора:
Файл .env с переменными был создан таким образом, чтобы люди не вводили свои учетные данные в репозитории github и в других местах, где они могут совместно использовать источник.
Теперь, будучи переменными среды, они становятся системными в течение всего времени HTTP-запроса (в этом случае выполнение скрипта). Дело в том, что у вас длинный сценарий.
Чтобы найти окончательное решение, вы можете пойти одним из трех способов.
….
«namespace» – переменные ENV.
Это скорее комментарий, чем ответ, но у меня пока нет комментариев. У меня была аналогичная проблема, хотя и я могу помочь.
Если эти два приложения используют общие каталоги, laravel использует файловую систему для кэширования по умолчанию.
Если вы хотите разделить базу кода с двумя разными подключениями к базе данных, используйте вместо этого базу данных для кэширования. Вы можете опубликовать перенос, чтобы создать таблицу кэша с помощью команды php artisan cache:table
Затем просто запустите php artisan migrate
и измените строку CACHE_DRIVER
в вашем .ENV-файле на 'database'