配置文件基本可以说是每个项目都会有,在配置文件中我们通常会配置数据库访问地址、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扩展配置

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来缓存配置文件提高性能,但笔者在实际测试中发现差别不大,估计是由于配置文件还不够大的原因,因为拆分了配置?有兴趣的小伙伴可以自行研究测试下,欢迎分享。

小结

通过这样的配置方式我们很好地解决了配置文件的管理问题,可以很方便将整个版本库的代码直接推送到测试环境和发布到生产环境。需要注意的是:如果生产环境的配置有较强的保密性,那就只能在发布的时候进行配置了。

php-yaf,php yaf框架扩展实践一——配置篇相关推荐

  1. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  2. selenium java框架_自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  3. OpenGauss数据库在 CentOS 上的实践,配置篇

    服务器准备 本篇博客可以使用华为云提供的测试 ECS,进行实践,领取地址为:https://activity.huaweicloud.com/free_test/ 如果没有领取到或者名额已满,可以用 ...

  4. php yaf 教程,干货:PHP YAF框架实践教程——配置与多模块

    配置文件基本可以说是每个项目都会有,在配置文件中我们通常会配置数据库访问地址.redis连接.url地址等等.早年开发的时候经常碰到这样麻烦的问题:就是本地开发环境的配置和测试环境.生产环境的配置都不 ...

  5. php yaf 教程,yaf 入门

    一.了解 ·yaf是php框架中性能最好的框架,因为它是用c语言以扩展方式实现的,其框架类.配置常驻内存. ·相较原生php的类,经过ab测试,性能损失仅约10%. ·支持自定义视图解析.路由,且拥有 ...

  6. php yaf 安装,Yaf安装与部署

    Yaf安装与部署 Yaf安装与部署 Yaf框架是基于扩展的mvc框架,用c实现的,因此性能效率都比一般的框架要高. github地址:github.com/laruence/php-yaf ### 一 ...

  7. 【视频课】模型部署课程更新!ncnn框架快速实践!

    前言 欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下: 第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用. 第2层 ...

  8. 美团图神经网络训练框架的实践和探索

    美团搜索与NLP团队在图神经网络的长期落地实践中,基于业务实际场景,自主设计研发了图神经网络框架Tulong,以及配套的图学习平台,提升了模型的规模和迭代效率.本文介绍了模型归纳抽象.基本框架.性能优 ...

  9. 专访智链ChainNova CTO谢文杰:区块链容器化与水平扩展实践

    [编者按]每个人的成长曲线不同,有的人在研究生之时就已有相当知名的产品和框架,从而在接下来的工作中一路顺风顺水,有的人缺需要经历一个又一个的坑才能成长,不管是前者的聪明高效,还是后者的稳扎稳打,他们都 ...

最新文章

  1. 修正后的SYSTEM_THREADS与SYSTEM_PROCESSES结构体
  2. buu 权限获得第一步
  3. ios配置pch文件及使用
  4. 深度学习(7)TensorFlow基础操作三: 索引与切片
  5. [Golang]slice值传递存在的问题
  6. ECCV 2020 | 比GAN更强,ETH提出新型超分辨率模型SRFlow
  7. 11张图步步演进:你一定能看懂的【分布式系统】容错架构设计!
  8. ThinkPHP叫号系统
  9. “好烦!自拒修电脑后,妹子又约我学机器学习,咋办?”
  10. android studio聊天跳转_android app跳转到微信的示例
  11. 关于Exchange Server 2010(WEB浏览证书)证书问题
  12. 新手android中ListView实现音乐列表
  13. 迷你上标和下标复制大全(含0~9、字母、特殊字符)
  14. poj-1069(三角形和六边形)(转)
  15. 小米音频测试软件,小米10 Pro成DXOMARK手机音频新榜首 雷军略显骄傲
  16. 赚多多V10自动抢单系统源码_派单连单管理新增设置订单佣金
  17. >> 读书记录_2021
  18. GUI设计和UI设计有什么区别?
  19. RRT、RRT-connect、RRT*等算法、A*等等路径规划算法
  20. aspnetdb.mdb数据库介绍

热门文章

  1. 吃鸡修改服务器,绝地求生自定义服务器怎么玩 自定义服务器使用说明
  2. java中switch用法举例范围_Java中Switch用法代码示例
  3. smart lock蓝牙解锁失效
  4. 微信公众号所有历史文章的标题/点赞数/阅读数统计
  5. qq浏览器开源播放器_使用极简的开源Web浏览器Min浏览网络
  6. vue中的mixins的介绍和使用
  7. Android驱动USB摄像头
  8. python常用的库
  9. pytorch学习(1) 数据集制作
  10. 【网站架构】云计算、大数据时代如何调用云计算、爬虫数据程序