在没有数据库的情况下存储,更新,检索PHP应用程序的设置

时间:2009-07-26 23:13:58

标签: php xml configuration-files

我需要能够将php应用程序的数据存储在文件中。我需要能够在没有PHP本身以外的任何外部依赖的情况下执行此操作。

以下是我的要求:

  • 不会经常更新/添加/删除设置。因此,更新设置不一定非常有效。但是,我确实希望能够通过PHP脚本完成所有操作,而不是通过编辑文件。
  • 将不断阅读设置,因此读取设置必须非常高效。
  • 设置采用独特的格式,如果我将它们放在数组中,它可能类似于$ Settings [“Database”] [“AccessSettings”] [“Username”] [“myDBUsername”];
    $设置[ “数据库”] [ “AccessSettings”] [ “密码”] [ “myDBPassword”];

我宁愿没有像上面提到的那样存储在数组中的设置。相反,我更喜欢一些访问方法:getConfig(“Database”,“Accesssettings”,“Username”)将返回'myDBUsername'。原因是我想限制我在全局范围内存储的变量。

获取/检索这些内容的最佳方法是什么?

我认为可能是xml文件的层次结构,但我不确定访问xml文件的PHP是什么样的(特别是我需要能够添加,编辑和删除)。如果它应该是XML,我应该研究什么样的xml访问。

如果是另一种格式,我想指出正确的方向,以了解如何使用该格式。

4 个答案:

答案 0 :(得分:3)

Brian,parse_ini_file就是你所需要的。

啊,我错过了你要通过PHP编辑它的要求。

在这种情况下,PHP没有任何原生可用于此目的。你必须自己动手。

您可以通过简单地使用Zend_Config_Ini来节省自己的时间。我知道你声明你不想使用任何其他东西,但Zend Framework的结构允许你使用你需要的任何部分。 Zend_Config可以单独使用。您当然可以将这几个类添加到项目中,让它们处理您的INI文件解析。

以下是使用上述示例的示例:

[config]
Database.AccessSettings.Username = myDBUsername
Database.AccessSettings.Password = myDBPassword

您可以像下面这样加载和访问它:

$config = new Zend_Config_Ini('/path/to/ini', 'config');
echo $config->Datbase->AccessSettings->Username; // prints "myDBUsername"
echo $config->Datbase->AccessSettings->Password; // prints "myDBPassword"

要编辑和保存配置,您将使用以下内容:

$config->Database->AccessSettings->Password = "foobar";
$writer = new Zend_Config_Writer_Ini(array('config'   => $config,
                                           'filename' => 'config.ini'));
$writer->write();

修改

不确定为什么人们根据vog误导的评论对此进行投票。通过使用独占锁来使多个人可写这个是非常简单的。 Zend_Config_Writer使用file_put_contents来编写,其中始终支持LOCK_EX标志,该标志专门锁定文件以进行写入。使用此标志时,不能让多个写入程序同时尝试更新文件。

要将此标志与Zend_Config_Writer一起使用,它就像下面这样简单:

$writer = new Zend_Config_Writer_Ini(array('config'   => $config,
                                           'filename' => 'config.ini'));
$writer->setExclusiveLock(true);
$writer->write();

另一种语法:

$writer = new Zend_Config_Writer_Ini();
$writer->write('config.ini', $config, true); // 3rd parameter is $exclusiveLock

答案 1 :(得分:0)

如果您不是手动编辑,请使用序列化数据。

使用serialize编写配置:

file_put_contents('myConfig.txt', serialize($Settings));

使用unserialize阅读配置:

$Settings = unserialize(file_get_contents('myConfig.txt'));

您可以使用PHP魔术函数__get()和__set()编写一个用于修改和获取此数据值的类。

答案 2 :(得分:0)

如果您愿意放入图书馆,可以使用Spyc并将您的配置放在YAML文件中。

您也可以使用PHP's support for SQLite,这意味着您的数据库只是一个文件,因此不需要数据库服务器。

答案 3 :(得分:0)

DBM文件可能不是一个坏主意。 PHP内置了对各种DBM文件类型的支持:

http://www.php.net/manual/en/book.dba.php