我在同一台服务器上运行了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'不存在'
答案 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'