Php 如何检查文件是否已更改?

Php 如何检查文件是否已更改?,php,Php,我有一个包含数据库信息的xml文件,在安装脚本或文件内容更改时应加载该文件。我是否可以对xml文件使用md5_file(),然后将该值存储在数据库中,并在每次运行脚本时将其与文件的哈希值进行比较?它有任何缺点吗?还有其他更快/更简单的方法吗?您最好存储文件修改时间,并将其与您将来检查的文件修改时间进行比较 if(filemtime('myfile.txt') > $result_set['filemtime']) { // file was modified } 我希望你能自己建

我有一个包含数据库信息的xml文件,在安装脚本或文件内容更改时应加载该文件。我是否可以对xml文件使用md5_file(),然后将该值存储在数据库中,并在每次运行脚本时将其与文件的哈希值进行比较?它有任何缺点吗?还有其他更快/更简单的方法吗?

您最好存储文件修改时间,并将其与您将来检查的文件修改时间进行比较

if(filemtime('myfile.txt') > $result_set['filemtime']) {
    // file was modified
}

我希望你能自己建立数据库。

最简单的方法是比较文件的日期-你可以使用
filemtime
,也许你可以使用。简单地说,此函数获取指定文件的文件修改时间

此函数返回一个值,因此需要将上次已知的修改时间保存在某个位置,以便将其与新值进行比较

$modifiedTs = filemtime($filename);
if ($modifiedTs != $lastModificationTs){
  echo "$filename was modified!";
}

这取决于你所说的“改变”是什么意思。如果您要求实际修改内容,那么仅检查
filemtime
是不够的-这是一个非常好的第一步,应该首先使用,但仅凭它本身是不够的


filemtime
与文件内容的散列(例如
md5_file
)相结合,它将高效地工作。

我知道我要回到这里,但这个问题帮助了我,所以我想分享一下我对它做了什么,因此,虽然这不是问题的答案,但我将把它变成一个社区wiki,这样它可以得到改进(我不是专家)

这是一个大得多的类的一部分,因此我去掉了其余部分,只提供了适用的代码,并使用一个非常常见的文件将其转换为一个易于遵循的示例:

class ApplicationLogger {

    private $logfile, $path;

    public function __construct() {
        $this->logfile  = 'error.log';
        $this->path  = '/var/log/apache2/';
    }

    public function logState() {
        $files = array(
            'target'  => $this->path . $this->logfile,
            'lastmod' => $this->path . $this->logfile . '_lastmod'
        );

        if (file_exists($files['lastmod']) && file_exists($files['target'])) {
            $lfh = fopen($files['lastmod'], 'r');
            while (!feof($lfh)) {
                $lines[] = fgets($lfh);
            }
            fclose($lfh);
        }

        $modified = false;

        /**
         * check if we have a matching hash.
         */
        if (isset($lines) && filemtime($files['target']) != $lines[0]) { // mod time mismatch
            if (md5_file($files['target']) != $lines[1]) { // content modified
                $modified = true;
            }
        }

        /**
         * update or create the lastmod file
         */
        if (!file_exists($files['lastmod']) || $modified) {

            $current_mod = filemtime($files['target']) . "\n" . md5_file($files['target']);

            file_put_contents($files['lastmod'], $current_mod);
            $modified = true;
        }

        return $modified;
    }
}
用法很简单:

$mod = new ApplicationLogger();
if ($mod->logState()) {
    // changed do something
}

根据您的需要进行调整,并根据您认为合适的方式进行改进。我希望您能通过编辑此CW贡献您的改编。

是的,您可以使用散列,或只是检查文件的修改时间。你可以在搜索引擎中输入你的问题…我只是在搜索引擎中输入了它,我就在这里结束了。这是一个完全合法的问题,这是讨论的最佳场所,imo。那么,仅仅使用md5_文件还不够吗?我只对内容是否不同感兴趣。如果它被相同的内容覆盖,或者如果文件名改变,这并不重要。然而,这是昂贵的。
filemtime
检查旨在作为更高效的查找。然后,只有当修改时间发生变化时,它才会执行昂贵的
md5_file
调用。但filetime唯一不同但散列不相同的时间是当它被相同的信息覆盖时,或者当文件名发生变化时,对吗?是的,或者如果
touch()
函数被调用。文件不仅仅是字节,当扩展属性更改时,md5对您没有帮助。我希望有一天人们会永远记住这一点,并有一次实现他们的软件,以便扩展属性变得可用。您是如何获得$lastmodifications的值的?@cup\u of-这将是您上次调用
filemtime
时的值。当您没有修改时间时,可以获取当前时间戳-然后再次调用
filemtime
并将其与以前的值进行比较时,它将不同,您将知道文件已更改。