将函数的动态输出大小与目标文件进行比较,然后进行重写

我有一个函数可以根据表单设置编写一个文本文件,这是一个相当大的形式。

简而言之,我想将函数的输出与单个文件进行比较,并且只在目标文件与输出不同时执行(重写文件)。如你所想,这是一个性能问题。

顺便说一下,BTW?

这个过程是,我填写了一些表格:

  1. 单个文件被编写为包含一些“特定”选定选项

  2. 一些“非特定”选项不一定会向文件写入任何内容。

该表单可以随时更新,因此文件内容可能会根据不同的选项而增大或缩小。

如果我在第一点,它只需要对文件进行重写。 在#2点时,不应写任何内容。

这是我试过的:

if ($output != file_get_contents($filepath)) {
 //save the data
}

但是我感到在这方面执行的延迟很大。

我发现了一个几乎类似的问题:我可以使用file_get_contents ()来比较两个文件?,但我的问题是不同的。 Mine正在将该过程的结果与已有的文件进行比较,该文件只是之前过程的结果。如果它们不同,只能重写文件。

没有敏感数据的形式,顺便说一句。 任何暗示都非常感谢。

谢谢

0
额外 编辑
意见: 1

3 答案

不是将整个文件加载到内存中,而是逐行读取( fgets )并逐行比较输入字符串可能会更快。你甚至可以像个性特征一样小,但我认为这是过分的。

0
额外
它们是,但是如果 filepath 很大,则需要很长时间。
额外 作者 Explosion Pills,
谢谢,听起来这两个是无与伦比的,对吗?
额外 作者 swan,
是的,你的意思是文件路径的内容。它可能很大,因为它包含了写在那里的文件的聚合。表单选项主要触发复制一些文本文件的内容并放在那里。
额外 作者 swan,

比较整个文件和字符串(我想这是一个字符串,不是吗?)唯一的方法是读取整个文件并进行比较。为了提高性能,您可以逐行阅读文件,并在第一行停止,如 Explosion Pills 在我之前所说。

如果你的文件真的很大,并且你想进一步提高性能,你可以做一些哈希的东西:

  • Generate the output, let's say $output.
  • Calculate md5($output) and store in $output_md5.
  • Compare $output_md5 with a stored one, let's say in file output.md5.
  • Are they equal?
    • If yes, do nothing.
    • If not, save $output into output.txt and $output_md5 in output.md5.
0
额外
谢谢,这听起来很合理,就像链接上建议的sha1_file()一样。
额外 作者 swan,
感谢您的详细步骤。
额外 作者 swan,
使用 sha1_file()可以让PHP在任何时候想要检查整个文件。计算SHA1或MD5(如你所愿)和存储,所以你不需要每次重新计算它。
额外 作者 lorenzo-s,

您总是可以尝试将其他文章中的函数与 sha1($ string)函数结合使用,并检查那。

0
额外
感谢澄清泥浆。
额外 作者 swan,
使用 sha1_file()会导致PHP在您想检查它的任何时候读取整个文件,因为需要计算散列值。这并不比检查文件内容更好。如果你沿着文件存储散列,然后使用存储的散列进行比较(就像我在我的回答中所说的那样),那么,好吧,你是正确的。
额外 作者 lorenzo-s,