我打算使用XML文档来存储我的下一个PHP项目的配置,格式类似于ASP.NET Web.Config文件。只有两个问题:
我认为阻止它被提供的最好方法是将文件类型更改为PHP并添加以下注释:
<?xml version="1.0" ?>
<!-- <?php if(!defined('FW_LOADED')){ exit; } ?> -->
<configuration>
....
</configuration>
这很好用,但我觉得这不是最佳解决方案。
是否有其他人使用XML来存储PHP项目的配置?什么是一些好的替代解决方案(如果没有定义常量,而不是在退出脚本的文件开头放置注释)?
更新
更改了问题标题以更好地反映我正在寻找的内容。对于误导性的原始问题标题,我们深表歉意。使用XML进行配置不是问题。我在使用XML进行配置时要求最佳实践。 请停止建议我使用数组或INI文件...
我希望配置文件尽可能简单易用,即使对于非php开发人员也是如此。我选择XML是因为它是语言中立的。我已经在使用SimpleXML来解析配置(部分)。我也不担心编译或加快速度,因为可以使用memcached或其他实用程序来实现。
目前最好的解决方案是:
我想听听在应用程序中使用XML进行配置设置的经验,以及它们如何阻止配置文件的提供。
答案 0 :(得分: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或其他缓存方案进行成熟的缓存。
答案 1 :(得分:5)
将它们放在文档根目录之外,或者如果您不能或不会将其限制为从外部访问,只需使用Apache mod_rewrite即可。例如:
RewriteEngine On
RewriteRule ^config.xml [R=404,L]
PHP有多个用于读/写XML的库,因此没有问题。如果它是相对简单(平坦)的数据,请考虑使用INI文件。 PHP有parse_ini_file()
作为内置函数,.Net上的任何内容都将读取.ini文件。
答案 2 :(得分:3)
我认为阻止从外部访问文件的最佳方法是将它们存储在根网站文件夹之外。
答案 3 :(得分:1)
如果您可以将其放在公共文件夹之外,那将是最佳解决方案。除此之外,cletus指定的mod_rewrite是一个不错的选择。
答案 4 :(得分:1)
在考虑应用程序配置时,有一个问题要回答谁将要管理它。如果它将由您作为开发人员进行管理而不期望某些第三方参与其中,最好的方法是将它们保存在PHP数组中,因为最终您总是将任何格式转换为某种对象或数组。这样你就受到了保护,因为除非你打印它,否则它将被解析为PHP而不会显示在输出中。
PHP现在有方便的SimpleXML http://php.net/manual/en/book.simplexml.php lib来操作XML数据。虽然,我更喜欢YAML http://www.yaml.org/作为配置语言,因为它不像XML那么冗长,并且具有很好的组合分层配置文件的方法,当你有多个开发环境如dev
,{{{ 1}},test
。还有各种用于处理YAML文件的PHP库。
由于配置包含在每个请求中,您可以将它们以某种方式缓存在内存中,如mamcache,apc或类似内容,以便在每次请求时都不会从磁盘读取。
关于保护对PHP解释器.xml或.yml未解析的文件的访问,正如其他建议的那样,将其保留在服务文件夹之外,或者使用重写规则。
答案 5 :(得分:1)
我没有寻找XML配置解决方案的替代品我正在寻找替代我阻止配置文件服务的方式。我应该更好地表达我的问题。
到目前为止,最好的解决方案是将文件移出Web根目录或使用htaccess。我已经决定在发布之前不做其中任何一个,我也应该提到这一点。
没有人说过在XML文件的顶部使用exit
语句有什么不好的,所以我想我现在会继续这样做。
答案 6 :(得分:0)
XML配置很慢。我想你需要将它们编译成PHP。或者使用PEAR_Config来简化工作。至于阻止从浏览器访问...简单的Apache指令与“订单允许,拒绝拒绝所有”将一起做。检查apache文档。
答案 7 :(得分:0)
您可以将xml文件存储在Web根目录之外,在这种情况下,如果没有登录到计算机的文件系统就无法访问它,或者您可以使用.htaccess(或等效的IIS)阻止访问您的config目录。
共享托管应该允许这两种情况。
答案 8 :(得分:0)
我建议使用普通数组进行配置。 有一个文件:
$conf['item1'] = 'value';
$conf['item2'] = 'value2';
等。
然后让文件调用所有$ conf项定义的文件,并添加路径或服务器URL或其他内容,并使用var_export将所有数据保存到文件中。
最后,您将拥有一个可以轻松调用的“已编译”文件。
注意:var_export只获取数组的内容,不是它的名字,也不是结尾';'