使用PHP打开并修改JSON文件



我将使用一个JSON文件来包含一些帖子的链接列表,并且它可以随时更新。但是,我对PHP的fopen()函数使用的模式感到困惑。这将是一个平面文件数据库,主要是让我学习使用文件,PHP和JSON,然后再进入一个适当的关系数据库(这不是一个庞大的页面集合,我担心使用SQL或类似的东西然而…)

我使用的过程是,一旦博客文章被键入,它将创建一个目录,保存一个新的index.php文件,其中包含所有让我查看页面的东西,然后,在我目前卡住的地方,更新一个JSON文件,包含标题,作者,日期,并链接到新创建的页面。

根据PHP手册,我可能想使用三种模式。r+,w+,或a+

我要使用的过程是采取JSON文件,并将数据放入数组。更新数组,然后将其保存回文件。

a+将指针放在文件的末尾,并且总是追加写操作,所以我认为这是这种情况下最糟糕的选择,因为我不会在文件末尾添加新的JSON条目(我很想在JSON对象的开头而不是末尾插入任何新数据)。

w+提到读写,但也截断文件-这发生在保存数据到文件时,还是发生在打开文件的那一刻?如果我在现有的JSON文件上使用这种模式,那么在我甚至可以修改数组并将其重新保存到对象之前,我会读取空白文件吗?

r+提到将指针放在文件的开头-保存数据是否会覆盖那里的数据,或者它会在存在的数据之前插入数据?如果插入,我该如何手动清除文件,然后将新修改的数组保存到JSON对象中?

哪种模式最适合我想要做的?有没有更好的办法呢?

如果你总是读取或写入整个文件,你根本不需要处理文件句柄——PHP提供了一对file_get_contents($file_name)file_put_contents($file_name, $content)函数,使用起来要简单得多。

当你处理文件的部分

时,具有不同模式的文件句柄是最有用的。例如,如果您使用的是CSV,您可以一次读取或写入一行,而不必立即在内存中存储完整的数据集。或者,对于二进制文件格式,您可能知道要从文件中读取的位置,并且可以"查找"。该位置的文件句柄。

您可能应该首先读取整个文件(例如使用file_get_contents(),然后使用使用w+打开它以写入新数据。(编辑:或者更确切地说,正如另一个答案指出的那样,使用file_put_contents(),当您只进行一次写操作时,它总是更简单。)

r+将覆盖您正在写入的所有文件,但不会擦除超出的部分。如果您的数据总是在增加,那么这个应该与完全覆盖文件相同,但是即使现在是这样,这个假设也可能会在将来弄乱您的数据。