2017-02-06 10 views
3

У меня есть 2 приложения Laravel, работающие на одном сервере. Сервер Apache 2.4, и у меня есть vhosts, настроенные для обслуживания каждого приложения в другом домене.Два приложения Laravel на одном и том же сервере конфликтуют друг с другом

Первое приложение является 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, от Почтальон, и с других серверов и все работает, как ожидалось.

Мое второе приложение само по себе также работает должным образом.

Однако, если мое второе приложение отправляет запрос к API, приложение API выдает эту ошибку:

exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'asapps.preprocessor_config' doesn't exist' in C:\notify\vendor\laravel\framework\src\Illuminate\Database\Connection.php:332

WTH?

База данных для API установлена ​​в DB_DATABASE = уведомляет, и она определенно правильно использует это соединение при отправке сообщений с других серверов. Так почему же он пытается использовать базу данных второго приложения , когда я вызываю API из этого приложения ??? Его почти так же, как он кэширует соединение с БД и пытается использовать тот же самый ... Как это остановить?

Table 'asapps.preprocessor_config' doesn't exist'

+0

изменить ваш конфигурационный/database.php изменения DB_DATABASE во втором приложении к DB_DATABASE2 и обновить файл .env для ссылки на DB_DATABASE2 и посмотреть, если это помогает решить проблему. –

+0

@SariYono same issue :( – DelightedD0D

ответ

1

После еще копания (читайте бешеные погуглите), я найдено problem and solution here

В нижней строке, когда сайт A принимает запрос, php загружает переменные .env для всей длины HTTP-запроса. Во время этого запроса, когда сайт A вызывает сайт B, поскольку они находятся на том же сервере, на котором работает тот же php, php все еще использует .env с сайта A и отдельно не загружает файл .env сайта B.

лучшее объяснение автора:

The .env file with the variables was created so that people would not push their credentials to github repositories and other places where they may share the source.

Now, being environment variables they become system wide for the entire duration of the http request (in this case script execution). The point is that you got a long running script.

To find a definitive solution you could go one of the three ways.

....

'namespace' the ENV variables.

+0

. Это хороший момент, решение, которое я получил в конце, заключалось в использовании разных экземпляров серверов, при разработке я использовал «php artisan serve» на разные порты – Musa

+1

@Musa, если вы используете apache, вы также можете объявить все свои переменные env непосредственно в объявлении vhost для каждого сервера. – DelightedD0D

0

Это скорее комментарий, чем ответ, но у меня недостаточно комментариев, чтобы комментировать. У меня была аналогичная проблема, хотя и я могу помочь.

Если эти два приложения разделяют любые каталоги, laravel использует файловую систему для кэширования по умолчанию.

Если вы хотите разделить базу кода с двумя различными подключениями к базе данных, используйте вместо этого базу данных для кэширования. Вы можете опубликовать миграцию для создания таблицы кэша с помощью команды ремесленника php artisan cache:table

Затем, просто запустите php artisan migrate и измените строку CACHE_DRIVER в файле .env для 'database'

+0

Спасибо за ввод. У каждого приложения есть своя собственная папка, и у них нет файлов. – DelightedD0D

+0

Для усмешек я сменил его на «базу данных» и выполнил миграцию, такую ​​же проблему – DelightedD0D

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

  • Нет связанных вопросов^_^