繁体   English   中英

使用XML进行PHP配置时的最佳做法?

[英]Best practices when using XML for PHP configuration?

我计划使用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进行配置设置的经验,以及它们如何阻止配置文件的提供。

这就是我通常对配置文件所做的事情 - 实际上,这是更基本的设置,通常它包含在自定义类中,它将多个配置文件组合到一个配置对象中:

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

将它们放在文档根目录之外,或者如果您不能或不会将其限制为从外部访问,只需使用Apache mod_rewrite 例如:

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

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

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

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

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

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

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

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

我没有寻找XML配置解决方案的替代品我正在寻找替代我阻止配置文件服务的方式。 我应该更好地表达我的问题。

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

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

XML配置很慢。 我想你需要将它们编译成PHP。 或者使用PEAR_Config来简化工作。 至于阻止从浏览器访问...简单的Apache指令与“订单允许,拒绝拒绝所有”将一起做。 检查apache文档。

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

共享主机应该允许这两种方案。

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

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

等等..

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

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

注意:var_export只获取数组的内容,而不是它的名字和结尾';'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM