在PHP中创建配置文件

Ali*_*izi 86 php configuration-files

我想为我的PHP项目创建一个配置文件,但我不确定最好的方法是什么.

到目前为止我有2个想法.

1使用变量

$config['hostname'] = "localhost";
$config['dbuser'] = "dbuser";
$config['dbpassword'] = "dbpassword";
$config['dbname'] = "dbname";
$config['sitetitle'] = "sitetitle";
Run Code Online (Sandbox Code Playgroud)

2使用Const

define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('TITLE', 'sitetitle');
Run Code Online (Sandbox Code Playgroud)

3用数据库

我将在课堂上使用配置,所以我不确定哪种方式最好或者有更好的方法.

Hug*_*ota 191

一种简单但优雅的方法是创建一个config.php只返回数组的文件(或任何你称之为的文件):

<?php

return array(
    'host' => 'localhost',
    'username' => 'root',
);
Run Code Online (Sandbox Code Playgroud)

然后:

$configs = include('config.php');
Run Code Online (Sandbox Code Playgroud)

  • 我也喜欢这种方法 - 我认为它比仅仅在包含文件中声明一个变量并假设它将在你的脚本中更清晰 (7认同)
  • 创建配置文件的答案方法在哪里?对于像我这样的php新手? (3认同)

Mar*_*ato 59

使用INI文件是一个灵活而强大的解决方案!PHP有一个本机函数来正确处理它.例如,可以像这样创建一个INI文件:

app.ini

[database]
db_name     = mydatabase
db_user     = myuser
db_password = mypassword

[application]
app_email = mailer@myapp.com
app_url   = myapp.com
Run Code Online (Sandbox Code Playgroud)

所以你唯一需要做的就是打电话:

$ini = parse_ini_file('app.ini');
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用$ini阵列轻松访问定义.

echo $ini['db_name'];     // mydatabase
echo $ini['db_user'];     // myuser
echo $ini['db_password']; // mypassword
echo $ini['app_email'];   // mailer@myapp.com
Run Code Online (Sandbox Code Playgroud)

重要信息:出于安全原因,INI文件必须位于非公用文件夹中

  • 我喜欢这种方法.额外提示:将文件重命名为app.ini.php.然后添加到第一行`; <?php die(); ?>`.如果此文件意外出现在公用文件夹中,它将被视为PHP文件并在第一行死亡.如果使用`parse_ini_file`读取文件,它会将第一行视为注释,因为`;`. (9认同)
  • @NickGames,您必须将该文件放在非公共文件夹中,否则您将面临严重的安全风险 (3认同)
  • @NickGames,请查看 [parse_ini_file() 文档](http://php.net/manual/en/function.parse-ini-file.php#99474) 中的 1 条评论 (2认同)
  • 注意:如果 ini 文件中的值包含任何 __non-alphanumeric__ 字符,则需要用 __double-quotes__ (`"`) 括起来。例如,任何密码都包含非字母数字字符。 (2认同)

BoD*_*DeX 23

我使用@hugo_leonardo 解决方案的轻微演变:

<?php

return (object) array(
    'host' => 'localhost',
    'username' => 'root',
    'pass' => 'password',
    'database' => 'db'
);

?>
Run Code Online (Sandbox Code Playgroud)

这允许您在包含php时使用对象语法:$configs->host而不是$configs['host'].

此外,如果您的应用程序在客户端需要配置(例如Angular应用程序),您可以将此config.php文件包含所有配置(集中在一个文件中,而不是一个用于JavaScript,一个用于PHP).然后诀窍是拥有另一个echo只有客户端信息的PHP文件(以避免显示您不希望显示的信息,如数据库连接字符串).叫它说get_app_info.php:

<?php

    $configs = include('config.php');
    echo json_encode($configs->app_info);

?>
Run Code Online (Sandbox Code Playgroud)

以上假设您config.php包含一个app_info参数:

<?php

return (object) array(
    'host' => 'localhost',
    'username' => 'root',
    'pass' => 'password',
    'database' => 'db',
    'app_info' => array(
        'appName'=>"App Name",
        'appURL'=> "http://yourURL/#/"
    )
);

?>
Run Code Online (Sandbox Code Playgroud)

因此,您的数据库信息保留在服务器端,但您的应用信息可以通过JavaScript访问,例如一种$http.get('get_app_info.php').then(...);呼叫.

  • 使其成为对象使得数据处理变得更加容易.例如,它允许将所有`app_info`参数作为JSON获取到最少的代码行. (2认同)

sym*_*ean 19

我对这里接受的答案以及它所获得的赞成数量感到惊讶.除了Marcio Mazzucato的答案之外,没有讨论任何多种方法的相对优点/缺点.

我看到的选项是:

基于文件的机制

这些要求您的代码在特定位置查找以查找ini文件.这是一个难以解决的问题,并且总是在大型PHP应用程序中出现.但是,您可能需要解决问题才能找到在运行时合并/重用的PHP代码.

常见的方法是始终使用相对目录,或者从当前目录向上搜索以查找在应用程序的基本目录中专门命名的文件.

用于配置文件的常见文件格式是PHP代码,ini格式化文件,JSON,XML,YAML和序列化PHP

PHP代码

这为表示不同的数据结构提供了大量的灵活性,并且(假设它是通过include或require处理的),解析的代码将从操作码缓存中获得 - 从而提供性能优势.

所述的include_path提供用于提取的文件的潜在位置,而不依赖于额外的代码的装置.

另一方面,将配置与代码分离的主要原因之一是分离职责.它提供了将其他代码注入运行时的路由.

如果配置是从工具创建的,则可以验证工具中的数据,但是没有标准函数来转义嵌入到PHP代码中的数据,如HTML,URL,MySQL语句,shell命令所存在的...... .

序列化数据 这对于少量配置(最多约200项)相对有效,并允许使用任何PHP数据结构.它只需要很少的代码来创建/解析数据文件(因此您可以花费大量精力确保文件仅使用适当的授权进行编写).

将自动处理写入文件的内容的转义.

由于您可以序列化对象,因此只需通过读取配置文件(__wakeup魔术方法)就可以创建调用代码的机会.

结构化文件

根据Marcel或JSON或XML的建议将其存储为INI文件还提供了一个简单的API,用于将文件映射到PHP数据结构(除了XML,以逃避数据并创建文件),同时消除代码调用使用序列化PHP数据的漏洞.

它将具有与序列化数据类似的性能特征.

数据库存储

这是最好的考虑你有大量的配置,但有选择性的当前任务所需 - 我很惊讶地发现,在大约150个数据项,从本地MySQL实例检索数据比从反序列化数据文件.

OTOH它不是存储用于连接数据库的凭据的好地方!

执行环境

您可以在PHP运行的执行环境中设置值.

这消除了PHP代码在配置的特定位置查找的任何要求.OTOH它不能很好地扩展到大量数据,并且很难在运行时普遍改变.

在客户端

我没有提到用于存储配置数据的一个地方是客户端.网络开销再次意味着这不能很好地扩展到大量配置.并且由于最终用户可以控制数据,因此必须以可检测到任何篡改的格式(即使用加密签名)存储,并且不应包含任何因其公开而受到损害的信息(即可逆加密).

相反,这对于存储最终用户拥有的敏感信息有很多好处 - 如果您不将其存储在服务器上,则不能从那里窃取.

网络目录 存储配置信息的另一个有趣的地方是DNS/LDAP.这将适用于少量小信息 - 但您不需要坚持第一范式 - 考虑,例如SPF.

基础设施支持缓存,复制和分发.因此,它适用于非常大的基础设施.

版本控制系统

配置与代码一样应该进行管理和版本控制 - 因此直接从VC系统获取配置是一个可行的解决方案.但通常这会带来显着的性能开销,因此缓存可能是可取的.


Col*_*n M 6

好吧 - 将数据库配置数据存储在数据库中会很困难 - 不管怎样?

但实际上,这是一个非常自以为是的问题,因为任何风格都是有效的,而且这都是偏好问题.就个人而言,我会选择配置变量而不是常量 - 通常是因为除非必要,否则我不喜欢全局空间中的东西.我的代码库中的所有函数都不应该能够轻松访问我的数据库密码(除了我的数据库连接逻辑) - 所以我在那里使用它然后可能会破坏它.

编辑:回答您的评论 - 解析机制中没有一个是最快的(ini,json等) - 但它们也不是您真正需要关注优化的应用程序的部分,因为速度差异会这些小文件可以忽略不计.