Intereting Posts
Он! P с элементами PHP DOM PHP 5.4 throw exception – Не удается увидеть сообщение с строковым сообщением ISO-8859-1 Как изменить значение в $ array2 без ссылки $ array1? Лучший способ обработки больших XML в PHP регулярное выражение, чтобы превращать URL-адреса в ссылки, не вступая в связь с существующими ссылками в тексте Тег комментариев Mysql, разбивающий мой код (PHP) Будет ли выигрыш в производительности CakePHP, если он откажется от поддержки двигателей JS / AJAX? Сокращение для обновления строки таблицы в базе данных? PHP: как проверить, является ли URL-адрес Youtube или vimeo's Как получить имя файла из полного пути с помощью PHP? Подписки WooCommerce – проверьте, есть ли у продукта активный абонент Неустранимая ошибка: Class 'MongoDB \ Driver \ Manager' не найден Как включить cURL в PHP / XAMPP Laravel 5.2 Отсутствие необходимых параметров для PHP – одинарные кавычки или двойные кавычки вокруг SQL-запроса?

Два приложения Laravel на одном сервере конфликтуют друг с другом

У меня есть 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'