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

6
我可以帮助您进行翻译。以下是您需要翻译的内容:

我在同一台服务器上运行了两个Laravel应用程序。服务器是Apache 2.4,我已经设置了虚拟主机以在不同的域上提供每个应用程序。

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

我可以从我的Swagger编辑器、Postman和其他服务器向API发送消息,一切都按预期工作。
我的第二个应用程序本身也按预期工作。
然而,如果我的第二个应用程序向API发送请求,API应用程序会抛出以下错误:
“PDOException异常,消息为“SQLSTATE[42S02]:基表或视图不存在:1146 Table 'asapps.preprocessor_config' doesn't exist”,位于C:\ notify \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection.php:332”
WTH?
API的数据库设置为DB_DATABASE = notify,当我从其他服务器发送消息时,它确实正确使用该连接。那么为什么当我从该应用程序调用API时,它要尝试使用第二个应用程序的数据库连接?它似乎在缓存DB连接并且继续使用同一个连接……我该如何停止它?
“Table 'asapps.preprocessor_config' doesn't exist”

更改您的 config/database.php 文件,将第二个应用程序中的 DB_DATABASE 更改为 DB_DATABASE2,并更新您的 .env 文件以引用 DB_DATABASE2,看看是否解决了您的问题。 - Sari Yono
@SariYono 同样的问题 :( - Wesley Smith
1个回答

4

在进一步查找(即疯狂地搜索)后,我在这里找到了问题和解决方案。

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

作者更好的解释:

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

现在,作为环境变量,在整个http请求的持续时间(在此脚本执行的情况下)内,它们变成了系统范围内的。重点是您得到了一个长时间运行的脚本。

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

....

“命名空间”ENV变量。


这是一个很好的观点,我最终得到的解决方案是使用不同的服务器实例,在开发中我使用了php artisan serve在不同的端口上。 - Musa Haidari
1
@Musa 如果你使用Apache,你也可以在每个服务器的vhost声明中直接声明所有的环境变量。 - Wesley Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接