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

时间:2013-02-04 23:43:48

标签: php

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

5 个答案:

答案 0 :(得分:6)

这取决于你所说的“改变”。如果您要求实际修改内容,那么检查filemtime是不够的 - 这是一个很棒的第一步,应该先使用,但这本身就不够。

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

答案 1 :(得分:4)

您最好的选择是存储文件模式时间并将其与您将来检查的文件模式时间进行比较。

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

我希望你能自己做数据库。

答案 2 :(得分:4)

也许您可以使用PHP's filemtime() function。简而言之,此函数可获取指定文件的文件修改时间。

此函数返回unix time stamp,因此您需要在某处保存上次已知的修改时间,以便将其与新值进行比较。

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

答案 3 :(得分:1)

最简单的方法是比较文件日期 - 您可以将filemtime用于此

答案 4 :(得分:1)

我知道我会回到这里,但是这个问题对我有帮助,所以我想分享我的所作所为,因此,尽管这不是对这个问题的答案,但我将其设置为社区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做出自己的修改。