我有一个正在开发的小型应用程序,我可能想将其提供/出售给其他人。我想保留一些设置,并创建一个管理界面来修改它们。将它们存放起来的最佳方法是什么?对于我将拥有的 10-20 个设置,DB 表似乎有点过头了,我希望尽可能快地检索这些设置。平面文件是另一个可行的选择吗?使用平面文件有哪些陷阱?与存储多个键和值的平面文件交互的最快/最简单方法是什么?
6 回答
我经常parse_ini_file
为此使用 PHP。
所以如果你用这个写一个 .ini 文件:
; This is a sample configuration file
; Comments start with ';', as in php.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"
并使用以下 PHP 代码阅读它:
define('BIRD', 'Dodo bird');
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);
你会得到这个输出:
Array
(
[first_section] => Array
(
[one] => 1
[five] => 5
[animal] => Dodo bird
)
[second_section] => Array
(
[path] => /usr/local/bin
[URL] => http://www.example.com/~username
)
[third_section] => Array
(
[phpversion] => Array
(
[0] => 5.0
[1] => 5.1
[2] => 5.2
[3] => 5.3
)
)
)
PHP 具有读取 .ini 文件的功能。
这实际上取决于您要存储的“设置”类型。它们是数据库主机、端口和登录等“引导”设置吗?还是它们是专门针对您的应用程序的应用程序设置?
让管理界面在文件系统上写入文件的问题是写入文件所需的权限。每当您打开 Web 服务器来写入文件时,都会增加代码中的错误可能导致严重的权限提升的可能性。
数据库旨在允许读取和写入,而不会引入潜在的系统安全风险。
我们使用“生成”的 PHP 文件来存储静态配置数据(如数据库访问信息)。它由用户在命令行上的实用程序脚本生成。之后,所有非静态信息都存储在数据库表中。反过来,数据库表很容易从管理区域更新。当您升级您的应用程序时,它很容易扩展和升级。
将需要备份的“数据”集中在一个地方也容易得多。
我可以建议使用 memcached 或类似的东西来加速它吗?
只是几个想法...
我认为通过 SimpleXMLElement 实现的 XML 对于这类事情非常有用。
配置(config.xml):
<config version="1">
<foo>value</foo>
<bar>
<baz>Boo</baz>
</bar>
</config>
阅读它的代码:
$config = simplexml_load_file('config.xml');
$version = (int) $config['version'];
$foo = (string) $config->foo;
$baz = (string) $config->bar->baz;
将其写入文件的代码:
$config = new SimpleXMLElement('<config version="1"/>');
$config->foo = 'value';
$config->bar->baz = 'Boo';
$config->asXML('config.xml');
使用平面文件的主要缺陷是它可能导致脚本崩溃或并发编辑时可能导致数据损坏。
考虑一个序列化为文件的 PHP 对象(或数组)。无需编写解析代码,足够快,可扩展。需要注意的是,随着代码的增长以支持进一步的设置,请考虑一种“升级”设置文件的策略。
我只是将 PHP 数组用于配置文件。
<?php
return array
(
'user' => 'name',
'pass' => 'word',
'one_day' => 60 * 60 * 24
);
?>
一些优点是,就像morendil提到的,不需要解析,它的速度很快,你可以存储各种复杂的变量/方程,你可以做以下事情:
<?php
$config = include 'path/to/file.php';
?>