Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有数据库的情况下存储、更新和检索PHP应用程序的设置_Php_Xml_Configuration Files - Fatal编程技术网

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

在没有数据库的情况下存储、更新和检索PHP应用程序的设置,php,xml,configuration-files,Php,Xml,Configuration Files,我需要能够将php应用程序的数据存储在文件中。我需要能够做到这一点,没有任何形式的外部依赖,除了PHP本身 以下是我的要求: 设置不会经常更新/添加/删除。因此,更新设置不必非常有效。但是,我确实希望能够通过PHP脚本完成这一切,而不是通过编辑文件 设置将不断读取,因此读取设置必须非常有效 设置是一种独特的格式,如果在数组中有它们,它可能类似于$Settings[“Database”][“AccessSettings”][“Username”][“myDBUsername”]$Settings

我需要能够将php应用程序的数据存储在文件中。我需要能够做到这一点,没有任何形式的外部依赖,除了PHP本身

以下是我的要求:


  • 设置不会经常更新/添加/删除。因此,更新设置不必非常有效。但是,我确实希望能够通过PHP脚本完成这一切,而不是通过编辑文件
  • 设置将不断读取,因此读取设置必须非常有效
  • 设置是一种独特的格式,如果在数组中有它们,它可能类似于$Settings[“Database”][“AccessSettings”][“Username”][“myDBUsername”]
    $Settings[“数据库”][“访问设置”][“密码”][“myDBPassword”]
我不希望像上面提到的那样将设置存储在数组中。相反,我更喜欢一些访问方法:getConfig(“数据库”、“访问设置”、“用户名”)将返回“myDBUsername”。这样做的原因是我想限制我存储在全局范围内的变量

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

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


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

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

使用以下命令写入配置:

使用以下命令读取配置:

您可以编写一个类,使用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