2

我需要能够将 php 应用程序的数据存储在文件中。我需要能够在没有 PHP 本身以外的任何外部依赖项的情况下做到这一点。

以下是我的要求:

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

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

获取/检索这些的最佳方式是什么?

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

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

4

4 回答 4

3

布赖恩,parse_ini_file是你需要的。

啊,我错过了您将通过 PHP 进行编辑的要求。

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

不过,您可以通过简单地使用Zend_Config_Ini为自己节省大量时间。我知道您声明您不想使用其他任何东西,但是 Zend 框架的结构允许您使用您需要的任何部分。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
于 2009-07-26T23:21:37.100 回答
0

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

使用serialize编写配置:

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

使用unserialize读取配置:

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

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

于 2009-07-26T23:18:38.870 回答
0

如果你愿意加入一个库,你可以使用Spyc并将你的配置放在一个YAML文件中。

您还可以使用PHP 对 SQLite 的支持,这意味着您的数据库只是一个文件,因此不需要数据库服务器。

于 2009-07-26T23:44:34.743 回答
0

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

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

于 2009-07-26T23:45:59.827 回答