(一)面试官:聊一下你对配置文件加载的了解吧!

426 阅读9分钟

在上期聊了ThinkPHP类的自动加载,如你还不太了解可以跟这下文链接去进行查看。本文会带你一起解读ThinkPHP配置文件。

前言

想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章。

当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善。

一、配置文件的种类

在这里插入图片描述
在这里插入图片描述

在ThinkPHP中有四类配置文件,你知道多少呢!不知道也没关系咔咔带你在看一次。

这四种配置文件分别为惯例配置、应用配置、模块配置、动态配置。

在这里需要说明一下,一般开发中惯例配置和动态配置是不会去使用的,尤其动态配置更不会去使用。

动态配置是直接使用Config::set("设置动态配置文件")来进行设置的,所以这个东西不要去用,一定不要去用,否则项目后期怎么去管理。

关于这四类配置文件咔咔直接用一幅图来给大家展示,就不过多说明了,本文的重点不是给大家介绍这玩意。

关于ThinkPHP5.1取消了单独的config文件,将应用配置修改到config下的app.php文件中。

新增了模块配置,模块配置也是在config目录下,例如你在app目录下有俩个模块,分别为index、admin这俩个模块,那么就可以直接在config目录下创建admin、index目录,然后创建对应模块的配置文件即可。

这四种配置文件的优先级就是上图的排列顺序,管理配置、应用配置、模块配置、动态配置

二、学习使用ArrayAccess

在文件thinkphp/library/think/Config.php,类Config实现了一个接口为ArrayAccess

这个时候你是不是有疑问了,这个类到底是干嘛的,为什么要去了解和学习它!带着这个疑问继续往下探寻答案吧!

到这个接口里边一探究竟。

在这个接口里边有四个接口需要实现分别为

  • offsetExists 检测偏移位置是否存在
  • offgetGet 获取一个偏移位置的值
  • offsetSet 设置一个偏移位置的值
  • offsetUnset 删除一个偏移位置的值

在这里插入图片描述 这几个函数放到这是不是有点懵呢!别着急,这就给你解答

这几个方法在Config中也进行实现,但是里边使用了几个方法,根据上边对方法的作用说明后。

像set、has、remove、get想想大家就知道是什么意思了。

在这里插入图片描述
在这里插入图片描述

接下来,咱们自己来实现一下这个类,给大家演示一下这个类用处到底是什么。ArrayAccess这个类不仅是TP大量使用,在laravel中也是大量存在,所以需要好好学习这个类的作用和思想。

需要在kaka目录下创建一个文件TestArrayAccess文件,并且设置一个属性,在实现ArrayAccess类。

至于我自己创建的这个文件夹kaka为什么会执行自动加载就是上一期在类的自动加载中实现的。

如若不会的话可以把文件先放置到extend目录下即可。

在这里插入图片描述 接着来到application/index/controller/Index.php控制器使用上图实现的方法

在这里插入图片描述
在这里插入图片描述

打印结果 在这里插入图片描述 这里在使用offsetGet打印的结果为kaka应该都明白怎么回事了吧!其余俩个方法就不去演示了,相信你也已经明白了。

所以说这个ArrayAccess类就是提供像访问数组一样访问对象的接口

三、了解Yaconf

估计有同学知道Yaconf就是我们牛逼克拉斯的鸟哥写的。

咔咔了解Yaconf后,总结推出这个开源的几点原因。

  • 配置文件过多,导致加载时间过长
  • 配置文件可读性差,需要运行解析
  • 配置文件与代码同属一个项目部署在一起会有安全隐患,同时如果配置文件修改时还需要走上线流程
  • 加大运维与开发协同难度,如果运维需要修改MySQL或者其它配置也需要通知开发进行同步修改

那么在来说一下使用Yaconf的优点

  • 不跟代码在一起,使用专属的配置目录
  • PHP启动时,加载完所有的配置,进行常驻内存,伴随着PHP的生命周期存亡,避免每次请求时解析配置文件,消耗时间
  • 配置文件跟代码分离,就可以借助配置后台管理来统一管理配置信息
  • 配置文件如有发生变化时会进行重载(这里给的建议是使用mv而非cp)
  • 支持类型丰富,例如:字符串、数组、分节、并且还可以在PHP配置文件里边直接使用PHP的环境变量和常量
  • 最后一点就是使用非常简单

在了解了Yaconf可以做什么的时候之后,在去开始下一步的操作,别一上来就是安装、配置、调用,然后一顿操作结束后,不知道是干嘛的,那样就没有任何意义了。

接下来将会介绍在win、linux上安装并且使用

四、Yaconf在window上安装

点击后边的DLL,选择对应的版本

在这里插入图片描述 选择适用的版本

在这里插入图片描述 如何判断什么版本适合自己,对照着我圈起来的几个地方去下载就对了

在这里插入图片描述 然后将这个文件放置到PHP的扩展目录里边 在这里插入图片描述 在这里插入图片描述 修改配置文件

extension=php_yaconf.dll

[yaconf]
yaconf.directory="D:\phpstudy_pro\WWW\yaconf"
yaconf.check_delay=60

在这里插入图片描述 重启环境,然后查看一下就ok了。

这里需要注意一点就是在复制的时候难免会有一些空格什么乱七八糟的东西,切记删除干净,否则你会知道什么叫难以启齿的柔弱。 在这里插入图片描述

五、Yaconf在window上使用

此时就直接在Yaconf的目录中创建一个ini文件,并且写上如下内容

在这里插入图片描述 控制器直接读取

在这里插入图片描述 经过打印出来的结果也是预期的值

在这里插入图片描述 文件如有改动,则直接重启ngixn即可

在这里插入图片描述 Yaconf提供的另外的一个接口为\Yaconf::has

在这里插入图片描述 在这里插入图片描述 以上就是Yaconf在window上的使用,使用起来还是相对简单的。

这里有一个注意点就是修改了Yaconf的配置文件之后我们需要重启web服务器。

六、Config源码剖析

虽说上面的Yaconf对于config的源码解析没有多大的帮助,但是也是在扩宽一下思路,以后在工作中可以尝试使用Yaconf。

进入正题,想知道Config是怎么进行加载解析的,先来画一个图。一起看一下加载config的执行流程。

在这里插入图片描述
在这里插入图片描述

回到public/index.php,在上一期说了类的自动加载是在加载base.php文件的过程中执行的。

那么config的加载是在下图框起来的这里,这里涉及到了容器,会有一个单独的专题来对容器进行剖析。

这里就不过多说明了,这段代码回去执行`D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\App.php这个文件的run方法。

在这里插入图片描述 并且在run方法中需要追踪的是initialize应用初始化这个函数

在这里插入图片描述 接着在initialize这个方法中就会看到配置文件的蛛丝马迹,随之而来就是一个初始化应用init

在这里插入图片描述 直到走到init方法中,才算是进入了主题。

开始了自动加载配置文件,并且还调用了config类中的load方法,也是需要一起阅读的。

在这里插入图片描述 来到这里之后需要简单的进行解读一下

这段代码会直接走到elseif中,因为在app目录下没有设置config目录

并且这里有个configPath这个属性熟悉吧!这个值最终就是D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\config\

在这里插入图片描述 在接这就是把config目录下的文件全部拿出来。

传递给config类的load方法

在这里有几个知识点提一下,就当回顾了

  • scandir :以升序的方式返回一个目录下的所有文件,还有第二个参数1,表示降序的方式返回一个目录下的所有文件。
  • pathinfo:以数组的形式返回文件信息,分别为目录名、文件名、扩展名,其中的几个参数代码中有提到,可以看下图即可。

在这段代码中有一个属性configExt,这个值是在环境变量读出来的,给的值是php

在这里插入图片描述 紧接着就需要来到thinkphp/library/think/Config.php这个文件了,在app文件中最后调用了config类中的load。

一起来看看都经历了什么

在load这个方法中,流程的最终走向会到loadFile这个方法中,至于elseif的代码为什么不会走,或者说这段代码就是多余的。

因为当Yaconf安装后在PHP启动后就会直接去加载对应的配置文件

在这里插入图片描述 来到loadFile这个文件后

我们都知道在ThinkPHP框架中,config目录下的所有文件都是PHP类型的

所以在判断了类型后就直接进入到set里边进行数据的处理

include直接引入的就是config目录下的配置文件,并且所有的配置文件都是直接return返回一个数组

在这里插入图片描述 在set方法中,这块代码就是核心了

一直循环合并数组,最终把所有的配置信息都返回给了config这个属性

截止到这里config目录下的所有配置就加载完成了。

在这里插入图片描述 以上就是config的加载流程,其实当你阅读完之后感觉也没有那么的难,就是编码技巧和思想。

而我们阅读源码不是看它代码怎么写的,是学习的它的编码思想,最终落地到我们自己的项目中。