在没有数据库的情况下存储、更新和检索PHP应用程序的设置
我需要能够将php应用程序的数据存储在文件中。我需要能够做到这一点,没有任何形式的外部依赖,除了PHP本身 以下是我的要求:在没有数据库的情况下存储、更新和检索PHP应用程序的设置,php,xml,configuration-files,Php,Xml,Configuration Files,我需要能够将php应用程序的数据存储在文件中。我需要能够做到这一点,没有任何形式的外部依赖,除了PHP本身 以下是我的要求: 设置不会经常更新/添加/删除。因此,更新设置不必非常有效。但是,我确实希望能够通过PHP脚本完成这一切,而不是通过编辑文件 设置将不断读取,因此读取设置必须非常有效 设置是一种独特的格式,如果在数组中有它们,它可能类似于$Settings[“Database”][“AccessSettings”][“Username”][“myDBUsername”]$Settings
- 设置不会经常更新/添加/删除。因此,更新设置不必非常有效。但是,我确实希望能够通过PHP脚本完成这一切,而不是通过编辑文件
- 设置将不断读取,因此读取设置必须非常有效
- 设置是一种独特的格式,如果在数组中有它们,它可能类似于$Settings[“Database”][“AccessSettings”][“Username”][“myDBUsername”]
$Settings[“数据库”][“访问设置”][“密码”][“myDBPassword”]李>
如果它是另一种格式,我想要一些指向正确方向的指针,以了解如何使用该格式。如果您不是手工编辑,请使用序列化数据 使用以下命令写入配置: 使用以下命令读取配置: 您可以编写一个类,使用PHP神奇函数uuu get()和uu set()修改和获取此数据的值。Brian,这是您所需要的 啊,我错过了通过PHP编辑的要求 在这种情况下,没有任何PHP本机可以用于此目的。你得自己滚 你可以通过简单地使用它来节省大量的时间。我知道您声明不想使用其他任何东西,但Zend框架的结构允许您使用所需的任何部分。Zend_配置可以自己使用。您当然可以将这几个类添加到项目中,让它们处理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用于执行写入操作,它始终支持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
如果您愿意访问库,则可以使用配置并将其保存在文件中
您还可以使用,这意味着您的数据库只是一个文件,因此不需要DB服务器。DBM文件可能不是一个坏主意。PHP内置了对各种DBM文件类型的支持:
这将是一个有趣的问题。请参阅下面我的更新答案。这将在多个客户端并行访问时严重失败。请澄清,当然您会与多个setter发生冲突,但多个阅读器不会有问题。问题的作者说:“设置不会经常更新/添加/删除。因此,更新设置不必非常有效。但是,我确实希望能够通过PHP脚本而不是通过编辑文件来完成这一切。”当然,我指的是并行写访问。“并行写入完全覆盖彼此”和“并行写入留下了无法再读取的混乱”之间有区别。虽然第一种变体可能可以接受,但第二种变体肯定不能接受。但是,第二种情况是可能的,因为file_put_contents()不是原子的。@hobodave:请不要把投票当成个人的事。我不知道你是否注意到了,但在你向我解释了为什么我的答案被误导后,我删除了我的答案。这将在多个web客户端并行访问时严重失败。@vog:缓存就是为了这个。另外,假设任何生产PHP站点都使用某种类型的字节码缓存,它提供了用户缓存,如APC。“设置不会经常更新/添加/删除。”为此投票否决我是愚蠢的。我们甚至不知道这是一个web应用程序,也不知道它支持多个客户端。@vog:你的评论是错误的。@Brian:我更新了上面的答案,是的,这是可能的。
$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