参数化/配置php应用程序的最简单方法|人性化数据序列化

参数化/配置php应用程序的最简单方法|人性化数据序列化,php,text,customization,Php,Text,Customization,当开发时间很重要时,其他人所能帮助的只是一个目标。我的PHP应用程序现在已参数化并配置了一个包含以下格式数组的include文件: $config = array( 'company' => 'BMC' , // the visible company name 'aplicable_tax' => .21 , // the IVA tax 'context_arr' => array(

当开发时间很重要时,其他人所能帮助的只是一个目标。我的PHP应用程序现在已参数化并配置了一个包含以下格式数组的include文件:

$config = array(
   'company'            => 'BMC' ,       // the visible company name
   'aplicable_tax'      => .21   ,       // the IVA tax
   'context_arr'        => array(
        'case1'             =>    12,    // the defalul value
        'case2'             =>    13,
        'case3'             =>    14
                           ),
   'EN_welcome_text'       => 'hello',   // do NOT translate on regionalization

   // xx comparation matrix
   'xx_maxref'=> 5,
   'xx_range' => array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
   'xx_comp'  => array( 
    //  V Other V  > I >>   0, 1, 2, 3, 4, 5, 6, 7, 8, 9
        /*  0 */     array( 0, 3, 5, 5, 5, 5, 5, 5, 5, 5),
        /*  1 */     array(-3, 0, 3, 5, 5, 5, 5, 5, 5, 5),
        /*  2 */     array(-5,-3, 0, 3, 5, 5, 5, 5, 5, 5),
        /*  3 */     array(-5,-5,-3, 0, 3, 5, 5, 5, 5, 5),
        /*  4 */     array(-5,-5,-5,-3, 0, 3, 5, 5, 5, 5),
        /*  5 */     array(-5,-5,-5,-5,-3, 0, 3, 5, 5, 5),
        /*  6 */     array(-5,-5,-5,-5,-5,-3, 0, 3, 5, 5),
        /*  7 */     array(-5,-5,-5,-5,-5,-5,-3, 0, 3, 5),
        /*  8 */     array(-5,-5,-5,-5,-5,-5,-5,-3, 0, 3),
        /*  9 */     array(-5,-5,-5,-5,-5,-5,-5,-5,-3, 0),
),


// and so on
// and so on
// and so on
)
但这种方法是不安全的,因为任何允许的编辑器都可以插入PHP代码或错误

我的问题是:

  • 您能推荐一种简单灵活的格式,让三方能够参数化PHP应用程序吗
  • 是否有从该格式到PHP的转换脚本

我发现最简单、最灵活的格式是使用内置的PHPs和。然后,您的配置阵列如下所示:

{
    "company" : "BMC",
    "aplicable_tax" : 0.21,
    "context_arr" :
    {
        "case1" : 12,
        "case2" : 13,
        "case3" : 14
    },
    "EN_welcome_text" : "hello"
}

优点是,您还可以将配置存储在其他地方(例如数据库),而不必让用户直接访问文件系统。

我使用的DB表有一个键、一个值和一个描述。 我通过其键请求配置值,说明显示在配置页面上

保护配置文件的一种方法是请求一个预先定义的常量,您将在脚本中定义该常量。

如果第三方有权访问代码,则无法实现有关防止第三方破坏代码的安全性的规范

到目前为止,提供的解决方案都有一些局限性,我认为这些局限性打破了规范中更重要的项目——灵活性和可维护性

  • 数据库解决方案可能会将 代码中的配置选项, 但你失去了格式的灵活性 (例如注释、复杂数据类型) 并且增加了复杂性和可维护性。此外,如果开发人员可以访问代码,他们可以简单地覆盖配置选项
  • 编码解决方案-这包括JSON、序列化和INI-与数据库解决方案相同的问题。仅限于编码的格式。增加了一层复杂性。具有项目访问权限的开发人员仍然可以覆盖配置选项
  • 数据库+编码解决方案包含所有相同的问题
我重申——如果你能访问代码,你就可以破解代码。PHP配置文件是配置项目的一种非常常见的方法。如果您不信任开发人员,请不要给他们访问权限。不要混淆代码,牺牲可维护性

关于PHP配置文件的更新 如果您要求回答配置PHP应用程序的最简单的方法,则该方法将是INI文件。PHP的核心配置来自这些文件。它的格式提供了所有您需要的语法-注释、数组等。它可以用本机函数进行解析-。如前所述,如果您担心安全性/访问性,可以将其从项目中排除,或将其保留在单独的位置。相反,如果您希望允许某人在不访问代码的情况下配置应用程序,他们只需编辑INI文件即可

有关nD阵列的更新
虽然
parse_ini_file()
确实不支持多维数组,但您可以将节与数组结合起来,以提供更复杂的配置。在我看来,除此之外的任何内容都非常接近平面数据文件,而不是配置文件,并且属于其他地方(即数据库)。

将此数据放入XML结构中,保证无需执行代码、多嵌套级别、任何类型的数据结构和注释。所有您需要的,IDE语法突出显示为优势。

用于解析-(作为变量)。

您始终可以使用.ini文件进行配置。它们不仅是一个标准,而且非常容易让人阅读,这将使配置应用程序变得更容易。此功能可以帮助您:


<>但是,你应该记住杰森所说的:“简单的事实是,如果你可以访问代码,你可以破解代码”

,假定已经拒绝了ini和.xml,我会考虑如下:

  • 删除$config=数组(第行和第行);行,只保留键=>值映射和注释
  • 不要包含配置文件,而是执行类似以下操作:

    eval(“$config=array(“+file\u get\u contents('config.file')+”)”)

您应该稍微解析一下
config.file
,以提供更多的保护,防止注入到我的头顶,一个未引用/未注释的
是危险字符,可能还有其他字符。大多数错误只会导致评估失败


也就是说,如果您不相信第三方不会提供危险的include文件,那么您需要选择不同的方法。您能否为第三方提供一个向您发布配置文件的web界面?注释/提示将以HTML的形式显示在屏幕上,但您可以使用漂亮、安全的JSON进行解析。

YAML是XML的一个很好的替代品。YAML的语法很轻,任何人都可以轻松地读/写。另一个重要的观点是YAML在散列和数组之间发挥了作用。我向您推荐symfony独立组件:

您的文件如下所示:

company: BMC         #the visible company name
aplicable_tax: 0.21  #the IVA tax
context_arr:
    case1: 12       #the defalul value
    case2: 13
    case3: 14
EN_welcome_text: hello #do NOT translate on regionalization

#xx comparation matrix
xx_maxref: 5
xx_range: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
xx_comp:
# V Other V  > I >>   0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    -[  0, 3, 5, 5, 5, 5, 5, 5, 5, 5 ] # [ 0 ]
    -[ -3, 0, 3, 5, 5, 5, 5, 5, 5, 5 ] # [ 1 ]
    -[ -5,-3, 0, 3, 5, 5, 5, 5, 5, 5 ] # [ 2 ]
    -[ -5,-5,-3, 0, 3, 5, 5, 5, 5, 5 ] # [ 3 ]
    -[ -5,-5,-5,-3, 0, 3, 5, 5, 5, 5 ] # [ 4 ]
    -[ -5,-5,-5,-5,-3, 0, 3, 5, 5, 5 ] # [ 5 ]
    -[ -5,-5,-5,-5,-5,-3, 0, 3, 5, 5 ] # [ 6 ]
    -[ -5,-5,-5,-5,-5,-5,-3, 0, 3, 5 ] # [ 7 ]
    -[ -5,-5,-5,-5,-5,-5,-5,-3, 0, 3 ] # [ 8 ]
    -[ -5,-5,-5,-5,-5,-5,-5,-5,-3, 0 ] # [ 9 ]

YAML拥有所有XML优势,甚至更多。

简单的事实是——如果你能访问代码,你就可以破解代码。
parse_ini_file()
不要管理2D数组
json
不要管理注释
XML
对于人工编辑器来说太冗长了:任何单个值都需要标记。如果有必要,我将编写解析器(我已经编写了一些),因此请建议一种有用的“数据”格式。(如果您想要
regex
或相关的东西,
serialize()
不太适合将变量存储在db?Hm中,我不会对用户可以编辑的东西使用serialize。是的,没有注释,你必须为配置对象结构创建一个实际的文档,例如json模式。我也很喜欢用json来做这些事情,它干净简单。唯一的缺点是,如果JSON语法有问题(缺少逗号、引号、,