【问题标题】:Best practices when using XML for PHP configuration?使用 XML 进行 PHP 配置时的最佳实践?
【发布时间】:2010-12-31 01:07:50
【问题描述】:

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

  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文件并返回一个数组。

标签: php xml configuration


【解决方案1】:

这是我通常对配置文件所做的——实际上,这更多的是基本设置,通常它被包装在自定义类中,将多个配置文件组合成一个配置对象:

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 或其他缓存方案进行的成熟缓存。

【讨论】:

    【解决方案2】:

    要么将它们放在文档根目录之外,要么如果你不能或不会限制它被外部访问,只需使用 Apache mod_rewrite。例如:

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

    PHP 有多个用于读取/写入 XML 的库,因此没有问题。如果它是相对简单(扁平)的数据,请考虑使用 INI 文件。 PHP 有 parse_ini_file() 作为内置函数,.Net 上的任何内容都会读取 .ini 文件。

    【讨论】:

      【解决方案3】:

      我认为防止从外部访问文件的最佳方法是将它们存储在根网络文件夹之外。

      【讨论】:

        【解决方案4】:

        我不是在寻找 XML 配置解决方案的替代方案,而是在寻找阻止提供配置文件的方式的替代方案。我应该更好地表达我的问题。

        目前最好的解决方案是将文件移出 Web 根目录或使用 htaccess。在发帖之前我已经决定不做这些,我也应该提到这一点。

        没有人说过在 XML 文件顶部使用 exit 语句有什么不好的地方,所以我想我会继续这样做,目前为止。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            PHP 现在有方便的 SimpleXML http://php.net/manual/en/book.simplexml.php 库来操作 XML 数据。虽然,我更喜欢 YAML http://www.yaml.org/ 作为配置语言,因为它不像 XML 那样冗长,并且具有编写分层配置文件的好方法,当您有多个开发环境(如 devtest、@987654325)时通常需要这些配置文件@。还有各种用于处理 YAML 文件的 PHP 库。

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

            关于保护对 PHP 解释器 .xml 或 .yml 未解析的文件的访问,因为其他人建议将其保留在服务文件夹之外,或使用重写规则。

            【讨论】:

              【解决方案7】:

              XML 配置很慢。我认为您需要将它们编译为 PHP。或者使用 PEAR_Config 来简化工作。至于阻止来自浏览器的访问...简单的 Apache 指令以及“命令允许,拒绝所有人”就可以了。检查 apache 文档。

              【讨论】:

                【解决方案8】:

                您可以将 xml 文件存储在 Web 根目录之外,在这种情况下,如果不登录计算机的文件系统就无法访问,或者您可以使用 .htaccess(或 IIS 等效项)来阻止对您的配置目录的访问.

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

                【讨论】:

                  【解决方案9】:

                  我建议使用普通数组进行配置。 有一个文件:

                  $conf['item1'] = 'value';
                  $conf['item2'] = 'value2';
                  

                  等等。

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

                  最后你会得到一个“编译”的文件,你可以很容易地调用它。

                  注意:var_export 只获取数组的内容,不是名称,也不是结尾的';'

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-01-15
                    • 2016-03-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多