0

假设我有一个用于 500 多个客户端的代码库,基于负载平衡的 Web 服务器。每个客户端都有自己的数据库,因此有自己的一组凭据。

这里的简单方法是为每个客户端凭据和环境设置使用不同的 .env 文件(顺便说一句,这很好用),但出于优化原因,我想运行“artisan cache:config”方法。这会将所有配置文件编译到 /bootstrap/cache 中的单个“config.php”文件中。

现在,对于很多客户来说,这不是很实用。我可以告诉 Laravel WHERE 在哪里查找缓存的配置文件吗?不改变核心代码?

就像从虚拟主机“CONFIG_PATH”和(伪代码)定义一个环境变量

if( null !== getenv("CONFIG_PATH") && getenv("CONFIG_PATH") != "" ) {
$app->bootstrapConfigPath( getenv("CONFIG_PATH") );
}

或者是拥有很多目录的唯一可能性,每个目录都有它们的“Bootstrap/cache”文件夹,以及指向共享代码库的符号链接(在我看来,这是一条相当繁琐的路径)

提前致谢。

4

1 回答 1

1

这是可能的,但您需要完成几个步骤。首先通过扩展Illuminate\Foundation\Application您自己的应用程序类并覆盖该bootstrapPath()方法。bootstrap/app.php然后,您还必须从您的自定义引导文件夹符号链接回原始文件。

例子

步骤1

/app/Applications/MyApp.php- 新的自定义应用程序类

<?php

namespace App\Applications;

use Illuminate\Foundation\Application as Laravel;

class MyApp extends Laravel
{   

  public function bootstrapPath($path = '')
  {

      $bootstrap_env = getenv('APP_BOOTSTRAP');
      if(!$bootstrap_env || !file_exists($bootstrap_env) || !file_exists($bootstrap_env.'/app.php')){
          dd("Install incomplete, please set bootstrap folder via APP_BOOTSTRAP, make sure the folder exists and the app.php is sym linked");
      }
      return $bootstrap_env;
  }

}

第2步

/app/bootstrap/app.php- 更新以实例化新的自定义类

- $app = new Illuminate\Foundation\Application(
-  realpath(__DIR__.'/../')
- );

+ $app = new App\Applications\MyApp(
+  realpath(__DIR__.'/../')
+ );

最后

创建自定义文件夹(确保它们是可写的)和当前 app.php 到自定义引导位置的符号链接。

mkdir -p /mycustomlocation/bootstrap/cache/

ln -s /laravel/install/bootstrap/app.php /mycustomlocation/bootstrap/app.php

useEnvironmentPath()*我们将此与使用实例化的方法设置自定义 .env 位置相结合$app

于 2018-04-24T21:37:39.140 回答