my_config.ini 与 my_config.php
Posted
技术标签:
【中文标题】my_config.ini 与 my_config.php【英文标题】:my_config.ini vs my_config.php 【发布时间】:2010-10-23 19:51:43 【问题描述】:在工作中,我们使用 .ini 文件在调用框架的其余部分之前设置变量(我认为是这样的
function getConfigVars()
//read my_config.ini file
....
//call framework
我一直想知道这样做是否有好处。
在我看来,你必须编写访问规则来阻止人们从网络上查看它,而 php 必须解析它并理解它。
那么,为什么要使用 my_config.ini 而不是 my_config.php?它不像任何人都应该在设置后触摸它,而且只要调用变量并能够让你的 IDE 自动完成文本,无论你在哪里使用 ini 变量/解析它是否有错误,似乎更方便。
【问题讨论】:
还有几个类似的问题,例如这里有一些相关信息:***.com/questions/798654/… 【参考方案1】:对于那些因为想知道使用必须解析的 INI 文件和简单包含(并且可以由 PHP 缓存)的 PHP 文件之间是否存在性能差异的人:是的,有是差异,但它们是如此之小以至于它并不重要。
我的基准测试场景是一个 config.ini
文件,其中包含 20 个键/值对和一个 config.php
文件,其中包含与定义相同的 20 个键/值对。 Ubuntu Linux 13.04 上的 PHP 版本为 5.4.9。
key1 = value1
...
key20 = value20
对比
<?php
define("key1", "value1");
...
define("key2", "value20");
两个测试脚本,包括配置:
<?php
$CONF = parse_ini_file("config.ini");
对比
<?php
require_once "config.php";
我用ab -c 25 -n 10000
测试了性能。
没有 PHP 缓存的结果:
ini: Requests per second: 2660.89 [#/sec] (mean)
php: Requests per second: 2642.28 [#/sec] (mean)
APC PHP 缓存结果:
ini: Requests per second: 3294.47 [#/sec] (mean)
php: Requests per second: 3307.89 [#/sec] (mean)
我多次运行测试,自然每次数字都会有所不同,但共识是:config.ini
在不使用 PHP 缓存时会快一点,config.php
在使用 PHP 缓存时会快一点用过的。但差异是如此之小,以至于决定不应该基于性能。
【讨论】:
【参考方案2】:当然,你的问题提出了一个公平的观点。
支持.ini
文件的几点:
使用其他语言的文件。如果您曾经想要让 Perl、Python、Ruby 等脚本使用该语言执行一些特别容易的操作,并且需要访问项目设置,那么如果您将设置存储在 PHP 文件中,那么您将不走运。
人工编辑数据。尽管您在问题中忽略了它,但意图与否很可能有人最终会戳进去,而且可能不是技术人员。 INI 格式远没有 PHP 代码那么可怕,即使只是一堆变量声明
更新设置。我认为创建一个新的 INI 文件比编写一个 PHP 文件要容易得多。然而,这是相当主观的,但值得一提。
设置变量之间的关系。使用 INI 文件为您的设置提供层次结构是相当容易/直观的。虽然使用 PHP 也可以做到这一点,但如果您尝试使用深度嵌套的关联数组来存储信息,它可能会变得不美观。
除此之外,在大多数情况下,“必须保护其免受 Web 访问”的敲击 INI 并不相关,因为大多数 PHP 项目(至少我参与的项目)都保留了相当多的代码从根文件夹,设置通常放在那里。
【讨论】:
【参考方案3】:Zend Framework 包含一个配置解析,用于解析以 ini 格式 (Zend_Config_Ini) 编写的文件,听起来这就是您正在使用的。
配置文件不应位于您的文档根目录中,如果它不在您的文档根目录中,则不需要重写规则,因为无论如何都没有人可以访问它。
INI 格式专门用于提供具有配置数据键层次结构和配置数据部分之间的继承的能力。通过使用点或句点字符 (.) 分隔键来支持配置数据层次结构。一个节可以扩展或继承另一个节,方法是在节名后面加上冒号字符 (:) 和要从中继承数据的节的名称。
来自Zend_Config_Ini 页面。
Zend 框架使用它来允许您拥有多个配置参数,一个用于暂存,一个用于开发,一个用于生产。这也允许为生产和开发轻松设置数据库设置,并具有两个非常不同的设置。在 ini 文件中设置了包含所在位置的不同路径。这使得将代码从开发迁移到生产变得更加容易,因为知道所有正在开发的东西都会立即关闭。
当然,这可以通过 PHP 脚本实现,但它需要更多地解析各种配置变量以及执行 if/then 检查,而使用 parse_ini_file() 会自动为您完成所有这些。
其他答案也已经指出,非程序员可能需要更改网站上设置为配置变量的变量和/或某些内容(例如,网站布局中使用的网站标题)。 INI 文件即使对于以前从未编程过的人也很容易理解和阅读。
来自我目前正在开发的网站的示例:
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users.db"
resources.view[] =
[staging : production]
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users-testing.db"
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = APPLICATION_PATH "/../data/db/users-dev.db
它使得为可以运行代码的各种环境拥有多个数据集变得非常容易。
【讨论】:
我希望我们有多个配置...我总是因为不小心使用 root/toor 提交配置文件而遇到麻烦,因为它比在本地创建一百个不同的数据库用户更方便 如您所见,使用 INI 配置文件可以轻松继承,但同时允许您根据我们所处的当前“模式”更改需要更改的变量。 【参考方案4】:好吧,对于非程序员来说,修改配置变量可能更容易......如果你的工作场所有必要的话。
我发现仔细放置 <?php
和 ?>
可以阻止它显示,而 parse_ini_file() 仍会从文件中获取相关数据。
不过,保护它的最佳方法是将其置于 docroot 之上,并在您的服务器设置中拒绝对 *.ini 的访问。
【讨论】:
以上是关于my_config.ini 与 my_config.php的主要内容,如果未能解决你的问题,请参考以下文章
在 osx 10.8 上安装 mysql-python 时找不到“my_config.h”文件
MySQLdb 安装错误 - _mysql.c:44:23: error: my_config.h: No such file or directory
Mac??????Mysql-python _mysql.c:44:10: fatal error: 'my_config.h' file not found