Laravel的配置加载其实就是加载config目录下所有文件配置。如何过使用php artisan config:cache则会把加载的配置合并到一个配置文件中,下次请求就不会再去加载config目录。

1.加载流程

  1. LoadEnvironmentVariables .env环境配置加载。如果缓存配置是不会加载.env
  2. LoadConfiguration 判断是否缓存配置
  3. 是,则直接加载配置,不会加载config目录所有文件了
  4. 否,则加载config目录所有PHP文件

2.什么时候加载配置?

内核启动的时候。加载以下启动类

\Illuminate\Foundation\Http\Kernel

protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class, // 加载 .env
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, // 加载config配置
...
];

本文重点讲解第二个config配置加载。第一个请查看 深入理解 Laravel 中.env 文件读取

3. 源码分析

LoadConfiguration类中config配置加载的具体逻辑。

其实就是判断缓存是否存在,存在则加载,不存在则递归遍历config目录所有php文件。如果运行php artisan config:cache,则会把加载结果保存在bootstrap/cache目录中;你可能还会看到services.php文件,这是一个保存所有的服务提供者的文件,具体以后会讲。

public function bootstrap(Application $app)
{
$items = []; // 首先,我们将看看是否有缓存配置文件。 如果是,我们将从该文件加载配置项,因此它非常快。
// 否则,我们需要遍历每个配置文件并加载它们。
if (file_exists($cached = $app->getCachedConfigPath())) {
// 加载缓存的配置文件
$items = require $cached; $loadedFromCache = true;
} // 接下来,我们将遍历配置目录中的所有配置文件,并将每个配置文件加载到Repository中。
// 这将使开发人员可以使用所有选项,以便在此应用程序的各个部分中使用。
$app->instance('config', $config = new Repository($items)); // 如果没有缓存配置才会去加载config目录
if (! isset($loadedFromCache)) {
// 加载config目录所有PHP文件
$this->loadConfigurationFiles($app, $config);
} //最后,我们将根据加载的配置值设置应用程序的环境。
// 我们将传递一个回调,该回调将用于在Web环境中获取环境,其中不存在“--env”开关。
$app->detectEnvironment(function () use ($config) {
return $config->get('app.env', 'production');
}); // 设置时区
date_default_timezone_set($config->get('app.timezone', 'UTC')); mb_internal_encoding('UTF-8');
} /**
* 从所有文件加载配置项。因此效率很低
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Contracts\Config\Repository $repository
* @return void
* @throws \Exception
*/
protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
{
// 遍历出所有PHP文件
$files = $this->getConfigurationFiles($app); if (! isset($files['app'])) {
throw new Exception('Unable to load the "app" configuration file.');
} // 一个一个的加载
foreach ($files as $key => $path) {
$repository->set($key, require $path);
}
}

4.小结与注意点

  1. php artisan config:cache之后不会加载config配置,即便你修改了config目录中的配置文件也是不生效的,除非清除缓存php artisna config:clear,或者重新缓存 php artisan config:cache
  2. 因为配置缓存可以提高效率,因此推荐生产环境使用配置缓存。
  3. 不能在config目录内定义配置以外的东西。比如在config目录内定义类,定义常量,自定义函数。这些都是不推荐的,因为配置缓存之后,config目录任何文件都不会加载,这些类或者常量不存在,最终导致自动加载失败。解决方案是使用composer.json的自动加载配置来加载:
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
},
"files": [
# 这样那个会加载helpers.php文件了。该文件定义的是辅助函数
"bootstrap/helpers.php"
]
},
  1. 在 config 中调用其他的 config('something.item') 是不会预期的加载的。因为不能保证配置something.item已经加载到了

深入理解 Laravel 中 config 配置加载原理的更多相关文章

  1. Django中模块的加载原理

    Django中的module的加载是通过反射来完成的,借助importlib中的import_module函数来实现的动态加载.import_module的内部通过使用了递归和线程锁,字符串的切割,实 ...

  2. 通过源码浅析Java中的资源加载

    前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...

  3. springcloud项目配置拓展从本地config目录加载

    本文受阿里开源的Nacos启发,应用启动后从Nacos服务加载配置到应用中,想着本地开发的时候加载配置能否从本地存储中加载,这样也能加快开发效率 首先我们来看下SpringCloud项目应用Nacos ...

  4. Mybatis源码解读-SpringBoot中配置加载和Mapper的生成

    本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...

  5. 【Dubbo源码阅读系列】之 Dubbo XML 配置加载

    今天我们来谈谈 Dubbo XML 配置相关内容.关于这部分内容我打算分为以下几个部分进行介绍: Dubbo XML Spring 自定义 XML 标签解析 Dubbo 自定义 XML 标签解析 Du ...

  6. Log4j2源码分析系列:(一)配置加载

    前言 在实际开发项目中,日志永远是一个绕不开的话题.本系列文章试图以slf4j和log4j2日志体系为例,从源码角度分析日志工作原理. 学习日志框架,首先要熟悉各类日志框架,这里推荐两篇文章,就不再赘 ...

  7. 理解Laravel中的pipeline

    理解Laravel中的pipeline suoga 关注  0.1 2015.09.08 00:00* 字数 1533 阅读 7151评论 8喜欢 24 pipeline在laravel的启动过程中出 ...

  8. Spring Cloud Nacos实现动态配置加载的源码分析

    理解了上述Environment的基本原理后,如何从远程服务器上加载配置到Spring的Environment中. NacosPropertySourceLocator 顺着前面的分析思路,我们很自然 ...

  9. 关于flume配置加载

    最近项目在用到flume,因此翻了下flume的代码, 启动脚本: nohup bin/flume-ng agent -n tsdbflume -c conf -f conf/配置文件.conf -D ...

随机推荐

  1. day14 Python format字符串格式化

    .format字符串拼接 # -*- coding:utf8 -*- #不一一对应会报错 tp1 = "i am {}, age {}, {}".format("char ...

  2. Appium——处理混合APP中H5的操作

    https://blog.csdn.net/iiyting/article/details/51887488

  3. Ubuntu最新的主要操作系统放弃32位支持?

    导读 现在是2018年,2019年即将到来——64位处理器已经成为主流很长一段时间了.如果你仍然使用32位的电脑,那么是时候把它扔进垃圾箱了. 我为所有基于Linux的操作系统维护者感到自豪,他们有勇 ...

  4. PAT A1118 Birds in Forest (25 分)——并查集

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  5. battery for stm32

    右边两个1N4148的压降都是0.7V,并且3.3-0.7=2.6V   &   3-0.7=2.3V  可见在电源3.3V正常供电的情况下,电池处于休息状态,这就有效避免了电池的不必要消耗:

  6. 如何屏蔽在Skyline的TerraExplorer中加载Shape或者KML等数据时的缓冲提示信息

    在使用TerraExplorer软件或者二次开发自定义打开FLY工程时,以及在已有的FLY工程中导入其他矢量数据,如SHP.WFS图层.KML图层时,总会看到类似下图的提示信息: 有些用户问,如何能屏 ...

  7. Java的运算符--与(&)、非(~)、或(|)、异或(^)详解

    一.计算机中存储的都是补码 java也是如此: System.out.println(Integer.toBinaryString(2)); System.out.println(Integer.to ...

  8. HSF源码阅读

    HSF各组成之间的关系 1 服务提供者注册与发布 <bean id="hsfTestService" class="com.test.service.impl.Hs ...

  9. H+ 后台主题UI框架

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 今天得到了一个非常完美的后端管理系统框架:H+ 后台主题UI框架 H+ 后台主题UI框架 H+是一个完全响应式,基于Bootstrap3.3.6最新 ...

  10. Rancher + k8s + docker 部署资料

    一.k8s 文档: https://jimmysong.io/kubernetes-handbook/concepts/deployment.html 命令行大全 https://kubernetes ...