问题描述

公司一个高并发API需要从Laravel移植到Lumen,由于数据库配置信息是通过远程或者缓存读取后动态配置,所以在中间件时使用到了 Config::set 然而实际运行时发现数据库配置并没有更新。

由于是从Laravel移植,因此保留了Facades的写法,Lumen中可以通过以下方法使用Facades:

  • 取消 bootstarp/app.php$app->withFacades(); 的注释

  • use Illuminate\Support\Facades\XXX

另一方面,系统使用 Redis 作为缓存,通过 env 配置 Redis ,配置信息存储在 config/database.php 在没有使用数据库先使用缓存的情况下,报没有传配置项的错误。

问题分析

通过阅读源码 laravel/lumen-framework/src/Application.php 发现,Lumen中的服务都是按需绑定并加载。先来看看 make() 的代码:

public function make($abstract, array $parameters = [])
{$abstract = $this->getAlias($this->normalize($abstract));if (array_key_exists($abstract, $this->availableBindings) &&! array_key_exists($this->availableBindings[$abstract], $this->ranServiceBinders)) {$this->{$method = $this->availableBindings[$abstract]}();$this->ranServiceBinders[$method] = true;}return parent::make($abstract, $parameters);
}

Lumen通过数组 $availableBindings 实现了基本服务的按需绑定并加载。在服务按需绑定并加载的时候,使用了类似组件的形式通过 loadComponent() 载入配置项并绑定服务。再来看看 loadComponent() 的代码:

public function loadComponent($config, $providers, $return = null)
{$this->configure($config);foreach ((array) $providers as $provider) {$this->register($provider);}return $this->make($return ?: $config);
}

如此就释然为什么在中间件以及使用 DB 之前想要动态配置数据库的信息时无法正确的写入配置项了。因为在这个时候 DB 的相关配置文件还没有被载入。你先写入了配置项当使用 DB 的时候会再次载入配置文件中的配置项覆盖动态写入的内容。

同理,使用 Redis 时,由于 Redis 相关配置是写在 database.php 里的,仅仅通过 $app->register(Illuminate\Redis\RedisServiceProvider::class); 注册是无法获取到配置项,如果在使用 Redis 时之前没有使用 DB 就会报没有传配置项的错误。

解决方案

既然找到了问题所在,要解决起来也是很方便的。只要在修改、使用配置项之前先载入配置文件就可以解决这些问题。比如:

  • 使用 app()->configure('database'); 载入所需要的配置文件

  • 在注册绑定服务到服务容器的时候使用 loadComponent 进行注册绑定


欢迎关注我的博客 http://targetliu.com

Lumen配置文件按需加载出现的坑相关推荐

  1. php拓展板块 按需开启,php如何按需加载方式来增加程序的灵活度

    设计模式的命名啊什么的,我基本上已经忘记得差不多了,我就把我现在表述的这个东西叫做按需加载吧. 需求: 1.我希望有一个配置文件读写类,不需要修改原本这个配置文件读写类就可以实现扩展: 2.这个扩展是 ...

  2. ant design pro取消登录_JeecgBoot实战按需加载 Ant-Design-Vue和Icon

    一.Ant-Design-Vue 按需加载 1.创建js文件 src/components/lazy_antd.js import Vue from 'vue'// base library impo ...

  3. React单页如何规划路由、设计Store、划分模块、按需加载

    本项目地址:react-coat-helloworld react-coat 同时支持浏览器渲染(SPA)和服务器渲染(SSR),本 Demo 仅演示浏览器渲染,请先了解一下:react-coat 第 ...

  4. php按需加载方式来增加程序的灵活度

    设计模式的命名啊什么的,我基本上已经忘记得差不多了,我就把我现在表述的这个东西叫做按需加载吧. 需求: 1.我希望有一个配置文件读写类,不需要修改原本这个配置文件读写类就可以实现扩展: 2.这个扩展是 ...

  5. Ant-Design-Vue和Icon按需加载方案 - JeecgBoot实战

    JeecgBoot实战 - 按需加载方案 文章目录 JeecgBoot实战 - 按需加载方案 一.Ant-Design-Vue 按需加载 二.Icon按需加载 一.Ant-Design-Vue 按需加 ...

  6. vue按需加载组件_微人事首页加载速度提高了 5 倍,我都做了什么?

    「本文之前发过,但是比较零散,这里我把用到的方案都汇总一下,方便大家索引,有需要的小伙伴可以收藏下方便查找.里边提到的几种方案,大家都可以对照着视频试一下」 ElementUI 按需加载: 服务端开启 ...

  7. vue tree组件_Ant-Design-Vue和Icon按需加载方案 - JeecgBoot实战

    JeecgBoot实战 - 按需加载方案 一.Ant-Design-Vue 按需加载 1.创建js文件 src/components/lazy_antd.js import Vue from 'vue ...

  8. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)

    一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...

  9. echarts中x轴文件消失_百度Echarts图表在Vue项目的完整引入以及按需加载

    导语 近日在项目中需要进行图表展示,百度的Echarts图表是非常合适的一个选择.项目是vue-cli搭建的,如何在项目中引入Echarts就是一个问题了.亲自动手实践了下,整理总结,希望对小伙伴提供 ...

最新文章

  1. elasticsearch 分片_Elasticsearch教程:动手实践
  2. 关于绑定IP地址与端口号的见解
  3. python之路_文件操作解析
  4. 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
  5. java查看jdk源码_Java-如何查看JDK源码
  6. linux磁盘权限 /srv,Linux学习笔记之解压压缩,磁盘分区,软件包管理,权限
  7. bash error 环境变量错误
  8. 软件测试核心之用例设计
  9. 那些前端应该知道的HTTP知识
  10. python 闭包,装饰器,random,os,sys,shutil,shelve,ConfigParser,hashlib模块
  11. 手把手带你从0搭建一个Golang ORM框架(上)!
  12. asp.net配置文件connectionStrings加密和解密
  13. SSL安全证书过期的原因及解决方法
  14. 抖音运营从内容开始做起,抖音内容创作
  15. 三屏指挥调调度终端/三屏计算机/一机三屏指挥调度/三屏融合指挥调度
  16. CSS设置高斯模糊效果
  17. IOS多线程使用GCD与信号量实现生产者与消费者模式
  18. eclipese web前端开发教学_Web 前端怎样入门?
  19. 企业如何选择企业网盘
  20. 手机壁纸-小程序背景壁纸

热门文章

  1. 进化深度神经网络是推动技术发展的强劲动力
  2. 2019年上半年收集到的人工智能Python编程干货文章
  3. 2019年汽车AI计算技术及市场趋势
  4. 2019最强就业指南,看了达摩院十大科技趋势,再也不怕互联网寒冬
  5. AI产品之路:神经元与神经网络
  6. jieba之sedict(自定义字典)
  7. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务
  8. 有序回归(ordinal regression)
  9. 突破性进展!上海光机所成果登上《Nature》封面!
  10. AI不会很快取代作家——但未来可能比你想象的更近