同一服务器上的两个Laravel应用程序相互冲突

时间:2017-02-06 19:16:37

标签: php mysql laravel laravel-5 environment-variables

我在同一台服务器上运行了2个Laravel应用程序。服务器是Apache 2.4,我设置了vhost来为不同域上的每个应用程序提供服务。

第一个应用程序是一个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

第二个应用程序是一个UI,其中包括使用第一个应用程序中的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

我可以从Swagger编辑器,Postman和其他服务器向我的API发送消息,一切都按预期工作。

我的第二个应用程序本身也按预期工作。

但是,如果我的第二个应用程序向API发送请求,则API应用程序会抛出此错误:

  

异常'PDOException',消息'SQLSTATE [42S02]:未找到基表或视图:1146表'asapps.preprocessor_config'不存在'   在C:\ notify \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection.php:332

WTH?

API的数据库设置为 DB_DATABASE = notify ,当我从其他服务器发送邮件时,它肯定会正确使用该连接。那么为什么要尝试使用第二个应用程序的数据库呢?  我从该应用程序调用API时的连接???它几乎就像它缓存数据库连接并试图继续使用同一个......我该如何阻止它?

  

表'asapps.preprocessor_config'不存在'

2 个答案:

答案 0 :(得分:2)

经过多次挖掘(阅读疯狂的谷歌搜索)后,我找到了problem and solution here

底线,当站点A接受请求时,php会为http请求的整个长度加载它的.env变量。在该请求期间,当站点A调用站点B时,由于它们位于运行相同php的同一服务器上,因此php仍然使用来自站点A的.env,并且根本不单独加载站点B的.env文件。

作者更好的解释:

  

创建了包含变量的.env文件,以便人们不会将其凭据推送到github存储库以及可能共享源的其他位置。

     

现在,作为环境变量,它们在整个http请求期间(在本例中为脚本执行)变为系统范围。关键是你有一个长期运行的脚本。

     

要找到明确的解决方案,您可以采用以下三种方式之一。

     

...

     

'命名空间'ENV变量。

答案 1 :(得分:0)

这不仅仅是一个评论而是一个答案,但我还没有足够的代表发表评论。我有一个类似的问题,但也许可以提供帮助。

如果这两个应用程序共享任何目录,则laravel默认使用文件系统进行缓存。

如果要与两个不同的数据库连接共享代码库,请使用数据库进行缓存。您可以使用artisan命令php artisan cache:table

发布迁移以创建缓存表

然后,只需运行php artisan migrate并将.env文件中的行CACHE_DRIVER更改为'database'