16

在工作中,我们使用 .ini 文件在调用框架的其余部分之前设置变量(我认为它可以

function getConfigVars(){
    //read my_config.ini file
    ....
    //call framework
}

我一直想知道这样做是否有好处。

在我看来,您必须编写访问规则以阻止人们从网络上查看它,而 php 必须解析并理解它。

那么,为什么要使用 my_config.ini 而不是 my_config.php?它不像任何人都应该在设置后触摸它,而且只要调用变量并能够让你的 IDE 自动完成文本,无论你在哪里使用 ini 变量/解析它是否有错误,它似乎更方便。

4

4 回答 4

16

对于那些因为想知道使用必须解析的 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 缓存时快一点。但是差异是如此之小,以至于决定不应该基于性能。

于 2013-05-17T07:11:31.290 回答
11

可以肯定的是,您的问题提出了一个公平的观点。

支持文件的几点.ini

  • 使用另一种语言的文件。如果您曾经想要让 Perl、Python、Ruby 等脚本使用该语言做一些特别容易的事情,并且需要访问项目设置,如果您将设置存储在 PHP 文件中,那么您将不走运。

  • 人工编辑数据。尽管您在问题中忽略了它,但无论是否有意,很可能有人最终会戳进去,而且可能不是技术人员。INI 格式远没有 PHP 代码那么可怕,即使只是一堆变量声明

  • 更新设置。我认为创建一个新的 INI 文件比编写一个 PHP 文件要容易得多。然而,这是非常主观的,但值得一提。

  • 设定变量之间的关系。使用 INI 文件为您的设置提供层次结构是相当容易/直观的。虽然使用 PHP 也可以做到这一点,但如果您尝试使用深度嵌套的关联数组来存储信息,那么它就不那么整洁并且可能会变得难看。

除此之外,在大多数情况下,“必须保护其免受 Web 访问”的敲击 INI 并不相关,因为大多数 PHP 项目(至少是我参与的项目)都有相当多的代码远离根目录文件夹,设置通常放在那里。

于 2009-05-05T04:35:14.940 回答
10

Zend 框架包含一个配置解析,它解析以 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

它使得为可以运行代码的各种环境拥有多个数据集变得非常容易。

于 2009-05-05T04:40:34.583 回答
1

好吧,对于非程序员来说,修改配置变量可能会更容易......如果你的工作场所有必要这样做的话。

我发现仔细放置<?php?>可以阻止它被显示,而 parse_ini_file() 仍然会从文件中获取相关数据。

不过,保护它的最佳方法是将其放在 docroot 之上,并在您的服务器设置中拒绝对 *.ini 的访问。

于 2009-05-05T04:34:00.093 回答