配置文件基本可以说是每个项目都会有,在配置文件中我们通常会配置数据库访问地址、redis连接、url地址等等。早年开发的时候经常碰到这样麻烦的问题:就是本地开发环境的配置和测试环境、生产环境的配置都不全一样,像数据库连接配置、url地址配置等,每次更新项目到测试环境、生产环境的时候都需要修改配置,真的是非常麻烦。
幸好yaf对于配置文件的解析提供了节(section)的支持,并且还支持节之间的继承功能,将节的设置和yaf运行环境(yaf.environ)结合起来就可以达到很好的配置效果,且看如何实现。
配置运行环境
在配置php支持yaf的时候,可以设置一个参数yaf.environ:把本地开发设置成develop、测试环境配置成test、生产环境配置成product,如:
[yaf] extension=yaf.so yaf.use_namespace=1 yaf.environ=develop
通过设置运行环境,在项目中可以通过ini_get(‘yaf.environ’)获取环境参数,进而取到相应节的配置。
文件配置
yaf配置文件一般都放在项目的conf文件夹下,这里也不例外。yaf application实例化的时候需要传递一个配置文件路径,假设我们的配置文件叫application.ini,先看下application.ini的结构:
[common] ; 通用配置 [product : common] ; 生产环境配置 [test : common] ; 测试环境配置 [develop : common] ; 开发环境配置
这里的配置除了节之外,节和节之间还有继承关系。例如[product : common]就表示product的配置会继承common的配置。先配置一个数据库连接看看。
[common] ; 通用配置 ; 数据库配置 resources.database.params.driver = "pdo_mysql" resources.database.params.hostname = "127.0.0.1" resources.database.params.port = 3306 resources.database.params.database = "database" resources.database.params.username = "username" resources.database.params.password = "password" resources.database.params.charset = "UTF8" resources.database.params.driver_options.1002 = "SET NAMES utf8" [product : common] ; 生产环境配置 [test : common] ; 测试环境配置 [develop : common] ; 开发环境配置 resources.database.params.hostname = "127.0.0.1" resources.database.params.database = "database" resources.database.params.username = "username" resources.database.params.password = "password"
yaf在实例化应用的传递该配置文件路径和运行环境:
define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../')); $app = new \Yaf\Application(APPLICATION_PATH . "/conf/application.ini", ini_get('yaf.environ'));
这样当项目运行环境在develop下的时候,会优先读取[develop : common]内的配置,如果没有则会从[common]中获取。在项目中任何地方都可以通过
\Yaf\Application::app()->getConfig();
获取application.ini中的配置。
事实上该例中可以不用传递ini_get(‘yaf.environ’)参数,在实例化的时候yaf会自行读取php.ini中的yaf.environ参数。但如果是其它的配置文件,则需要传递该参数。
额外的配置
随着项目越来越庞大,配置也会越来越复杂,如果都放在项目默认的配置文件application.ini中,可能配置会有好几百行,这样就不容易维护了。一般我们会考虑新建配置文件用来存储额外的配置。yaf中提供了\Yaf\Config\Ini类来处理这些额外的配置文件。
$config = new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini', ini_get('yaf.environ'));
在实际读取的时候,最好能设置一个静态变量保存读取到的配置,避免重复申请系统open函数调用。如下:
static $config = null; if ($config === null) { $config = new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini', ini_get('yaf.environ')); }
详细可以参考yaf扩展示例Bootstrap中的getUrlIniConfig方法。
配置文件缓存
yaf官方有提到可以通过yaf.cache_config来缓存配置文件提高性能,但笔者在实际测试中发现差别不大,估计是由于配置文件还不够大的原因,因为拆分了配置?有兴趣的小伙伴可以自行研究测试下,欢迎分享。
小结
通过这样的配置方式我们很好地解决了配置文件的管理问题,可以很方便将整个版本库的代码直接推送到测试环境和发布到生产环境。需要注意的是:如果生产环境的配置有较强的保密性,那就只能在发布的时候进行配置了。