【问题标题】:Two Laravel applications on the same server conflicting with one another同一服务器上的两个 Laravel 应用程序相互冲突
【发布时间】:2017-06-23 20:27:52
【问题描述】:

我有 2 个 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

第二个应用程序是一个 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 应用程序会抛出此错误:

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

WTH?

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

表 'asapps.preprocessor_config' 不存在'

【问题讨论】:

  • 更改您的 config/database.php 将第二个应用程序中的 DB_DATABASE 更改为 DB_DATABASE2 并更新您的 .env 文件以引用 DB_DATABASE2 并查看是否可以解决您的问题。
  • @SariYono 同样的问题 :(

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


【解决方案1】:

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

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

作者更好的解释:

创建了带有变量的 .env 文件,这样人们就不会将他们的凭据推送到 github 存储库和其他可以共享源代码的地方。

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

要找到最终的解决方案,您可以采用以下三种方法之一。

....

“命名空间”ENV 变量。

【讨论】:

  • 这很好,我最后得到的解决方案是使用不同的服务器实例,在开发中我在不同的端口上使用了php artisan serve
  • @Musa 如果你使用 apache,你也可以直接在每个服务器的 vhost 声明中声明你所有的环境变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多