在使用XML进行PHP配置时的最佳实践是什么?

4

我打算使用一个类似于ASP.NET Web.Config文件格式的XML文档来存储我下一个PHP项目的配置。只有两个问题:

  1. 无法提供给浏览器。
  2. 必须在共享主机中可行。

我能想到的最好的方法是将文件类型更改为PHP,并添加以下注释以防止其被提供:

<?xml version="1.0" ?>
<!-- <?php if(!defined('FW_LOADED')){ exit; } ?> -->
<configuration>
....
</configuration>

这个方案能够正常工作,但我觉得不是最佳解决方案。

有没有人使用XML来存储PHP项目的配置?除了在文件开头放置注释并在未定义常量时退出脚本之外,还有哪些好的替代方案?


更新:

更改了问题标题以更好地反映我所寻找的内容。抱歉原来的问题标题有误导性。使用XML进行配置不是问题,我正在询问在使用XML进行配置时的最佳实践。请停止建议我使用数组或INI文件……

我希望配置文件尽可能易于使用,即使对于非PHP开发人员也是如此。我选择XML是因为它是语言中立的。我已经使用SimpleXML部分地解析了配置文件。我也不担心编译或使其更快,因为可以使用memcached或其他实用程序来实现。

到目前为止,最好的解决方案是:

  • 将其移出Web根目录。
    • 可能,但希望将配置文件尽可能靠近应用程序。
  • 使用htaccess隐藏配置文件。
    • 我不想冒险让某个人破坏了.htaccess文件,使配置文件暴露出来。

我想听听有经验的人如何在应用程序中使用XML进行配置设置,并防止配置文件被提供。


为什么不使用parse_ini来获取您的配置呢?它可以解析一个ini文件并返回一个数组。 - user2039664
9个回答

6

这是我通常为配置文件所做的事情 - 实际上,这更像是基本设置,通常会将其包装在自定义类中,将多个配置文件组合成单个配置对象:

config.php:

return array(
 'config1'=> 'config1value',
 'config2'=> 'config2value',
);

some_page.php:

$config= include('config.php');
if ($config['config1'])
 ...

配置信息存储为 PHP 数组格式的 PHP 文件中,由 PHP 引擎解析,不会返回给浏览器。(你可以通过将配置文件存储在 Web 根目录以外、设置 mod_rewrite 规则来防止提供配置文件/目录等方式进一步保护配置文件。)
将配置信息存储在 XML 文件中会增加每个请求解析 XML 文件的开销。高级配置数据的数据库存储很好,但也很昂贵(显然,数据库不会存储数据库连接信息,因此您仍需要针对某些基本信息进行配置)。配置数据通常非常静态(很少编写/每个请求都会读取),因此可以通过 memcached 或其他缓存方案进行缓存。

5

要么将它们放在文档根目录之外,如果您不能或不想这样做,则限制其无法从外部访问,只需使用Apache mod_rewrite。例如:

RewriteEngine On
RewriteRule ^config.xml [R=404,L]

PHP有多个用于读写XML的库,因此没有任何问题。如果数据相对简单(平面),考虑使用INI文件。PHP具有内置函数parse_ini_file(),而任何.Net上的东西都将读取.ini文件。


2

我认为防止文件被外部访问的最佳方法是将它们存储在根网站目录之外。


2
我并不是在寻找替代XML配置方案的解决方法,而是在寻找防止配置文件被访问的方法。我应该更好地表达我的问题。
目前最好的解决方案是将文件移出Web根目录或使用htaccess。在发布问题之前,我已经决定不采用这两种方法,我也应该提到这一点。
至今没有人对在XML文件顶部使用"exit"语句表示反对,所以我想暂时继续使用它。

1
如果您可以将其放在公共文件夹之外,那将是最佳解决方案。除此之外,cletus 指定的 mod_rewrite 是一个很好的选择。

1

在考虑应用程序配置时,有一个问题需要回答,那就是谁来管理它。如果由您作为开发人员进行管理,并且不希望涉及第三方,则最好的方法是将它们保存在 PHP 数组中,因为最终您总是会将任何格式转换为某种对象或数组。这样可以保护您,因为除非您打印它,否则它将被解析为 PHP 并且不会显示在输出中。

PHP 现在具有方便的 SimpleXML http://php.net/manual/en/book.simplexml.php 库来操作 XML 数据。尽管如此,我更喜欢 YAML http://www.yaml.org/ 作为配置语言,因为它不像 XML 那样冗长,并且具有组合分层配置文件的良好手段,这通常在您拥有多个开发环境(如 devtestlive)时是必需的。还有各种用于处理 YAML 文件的 PHP 库。

由于配置文件包含在每个请求中,因此可以将它们以某种方式缓存在内存中,例如 mamcache、apc 或类似的方式,以便不必在每个请求中从磁盘读取。

关于保护未被PHP解释器解析的文件(如.xml或.yml),建议将其放在服务文件夹之外,或使用重写规则。


0
我建议使用普通数组来进行配置。 有一个文件包含:
$conf['item1'] = 'value';
$conf['item2'] = 'value2';

然后,调用定义所有$conf项的文件,并添加路径、服务器URL或其他内容,并使用var_export将所有数据保存到文件中。

最终,您将拥有一个“编译”文件,可以轻松调用。

注意:var_export仅获取数组的内容,而不是它的名称或结尾的“;”


0

XML配置文件较慢。我认为您需要将其编译成PHP,或使用PEAR_Config来简化工作。至于如何防止浏览器访问...只需使用简单的Apache指令以及"Order allow, deny deny from all"即可。请参考Apache文档。


0

你可以将XML文件存储在网站根目录之外,这样访问时必须登录到计算机的文件系统才能够获取,或者你可以使用.htaccess(或IIS的等效方式)阻止对配置目录的访问。

共享主机应该允许这两种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接