使用XML进行PHP配置时的最佳实践?

使用XML进行PHP配置时的最佳实践?,php,xml,configuration,Php,Xml,Configuration,我计划使用一个XML文档来存储下一个PHP项目的配置,格式类似于ASP.NETWeb.Config文件。只有两个问题: 无法提供给浏览器 必须是可行的共享主机 我认为阻止它被提供的最好方法是将文件类型更改为PHP并添加以下注释: <?xml version="1.0" ?> <!-- <?php if(!defined('FW_LOADED')){ exit; } ?> --> <configuration> .... </configura

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

  • 无法提供给浏览器
  • 必须是可行的共享主机
  • 我认为阻止它被提供的最好方法是将文件类型更改为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进行配置设置经验的人的意见,以及他们是如何阻止配置文件被提供的。

    将它们放在文档根目录之外,或者如果您不能或不想限制它被外部访问,只需使用Apache即可。例如:

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

    PHP有多个用于读取/写入XML的库,因此不存在任何问题。如果是相对简单的(平的)数据,则考虑使用INI文件。PHP有一个内置函数,.Net上的任何东西都会读取.ini文件。

    我认为防止从外部访问文件的最好方法是将文件存储在根web文件夹之外。

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

    XML配置很慢。我认为,您需要将它们编译成PHP。或者使用PEAR_Config简化作业。至于阻止浏览器访问。。。简单的Apache指令加上“Order allow,deny deny from all”就可以了。检查apache文档。

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


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

    我建议使用普通阵列进行配置。 有一个包含以下内容的文件:

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

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

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


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

    这是我通常对配置文件执行的操作-实际上,这更多是基本设置,通常包装在自定义类中,该类将多个配置文件组合到单个配置对象中:

    config.php:

    return array(
     'config1'=> 'config1value',
     'config2'=> 'config2value',
    );
    
    一些_page.php:

    $config= include('config.php');
    if ($config['config1'])
     ...
    
    配置文件以PHP数组的形式存储在PHP文件中,因此PHP引擎将对其进行解析,并且永远不会返回到浏览器。(您可以通过将配置文件存储在web根目录之外、设置mod_重写规则以防止提供配置文件/目录等来进一步保护配置文件。)


    将配置信息存储在XML文件中会增加解析每个请求的XML文件的开销。高级配置数据的数据库存储很好,但也很昂贵(显然,数据库不会存储您的数据库连接信息,因此您仍然需要一些基本信息的配置解决方案)。配置数据通常是非常静态的(很少写入/读取每个请求),因此它是通过memcached或其他缓存方案进行缓存的成熟方式。

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

    PHP现在有方便的SimpleXML库来操作XML数据。尽管如此,我还是更喜欢YAML作为配置语言,因为它不像XML那样冗长,并且有很好的方法来组成分层配置文件,当您有多个开发环境时,如
    dev
    test
    live
    ,通常需要这些配置文件。还有各种用于处理YAML文件的PHP库

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


    关于保护对未经PHP解释器.xml或.yml解析的文件的访问,其他人建议将其从服务文件夹中删除,或使用重写规则。

    我不是在寻找xml配置解决方案的替代方案,而是在寻找防止配置文件被服务的替代方法。我应该用措辞来回答我的问题