我对这里所接受的答案感到惊讶,并且已经获得了许多赞扬。 除了Marcio Mazzucato的回答之外,没有讨论任何多种方法的相对优点/缺点。
我看到的选项是:
基于文件的机制
这些要求你的代码在特定的位置查找ini文件。 这是一个难以解决的问题,并且总是在大型PHP应用程序中出现。 但是,您可能需要解决这个问题,以便find在运行时被合并/重用的PHP代码。
常见的做法是始终使用相对目录,或从当前目录向上search,以查找在应用程序的基本目录中专门命名的文件。
用于configuration文件的常用文件格式是PHP代码,ini格式文件,JSON,XML,YAML和序列化的PHP
PHP代码
这为表示不同的数据结构提供了巨大的灵活性,并且(假设它是通过include或require处理的)parsing后的代码将从操作码caching中获得,从而带来性能上的好处。
include_path提供了一种抽象文件的潜在位置而不依赖于附加代码的方法。
另一方面,从代码分离configuration的主要原因之一是分离责任。 它提供了一个将附加代码注入运行时的path。
如果configuration是通过工具创build的,可以validation工具中的数据,但是没有标准函数来转义数据以embedded到PHP代码中,如HTML,URL,MySQL语句,shell命令所示。 。
序列化数据这对于less量configuration(最多约200项)相对有效,并允许使用任何PHP数据结构。 它只需要很less的代码来创build/parsing数据文件(所以你可以花费你的努力来确保文件只是用适当的授权书写)。
转义写入文件的内容是自动处理的。
由于您可以序列化对象,因此仅通过读取configuration文件(__wakeup魔术方法)就可以创build调用代码的机会。
结构化文件
按照Marcel或JSON或XML的build议将其存储为INI文件还提供了一个简单的API来将文件映射到PHP数据结构(除XML之外,用于转义数据和创build文件),同时消除代码调用使用序列化的PHP数据的漏洞。
它将具有与序列化数据类似的性能特征。
数据库存储
这是最好的考虑,你有大量的configuration,但有select性的需要什么是当前的任务 – 我很惊讶地发现,在大约150个数据项,从本地MySQL实例检索数据比反序列化一个数据文件。
OTOH它不是一个存储证书的好地方,可以连接到数据库。
执行环境
您可以在运行PHP的执行环境中设置值。
这删除了PHP代码在configuration的特定位置查找的任何要求。 OTOH不能很好地适应大量的数据,并且在运行时很难普遍地改变。
在客户端
我没有提到存储configuration数据的地方是在客户端。 networking开销又意味着这不能很好地适应大量的configuration。 由于最终用户对数据有控制权,因此必须以可检测到任何篡改的格式(即使用encryption签名)进行存储,并且不得包含任何因其披露而受损(即可逆encryption)的信息。
相反,这对于存储由最终用户拥有的敏感信息具有很多好处 – 如果您不在服务器上存储这些信息,则不能从那里窃取。
networking目录存储configuration信息的另一个有趣的地方是DNS / LDAP。 这将适用于less量的小部分信息 – 但是您不需要坚持第一种正常forms – 例如SPF 。
基础架构支持caching,复制和分发。 因此,它适用于非常大的基础设施。
版本控制系统
像代码一样的configuration应该被pipe理和版本控制 – 因此直接从你的VC系统获得configuration是一个可行的解决scheme。 但是,这通常伴随着显着的性能开销,因此caching可能是明智的。