5

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

4

5 回答 5

9

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

filemtime与文件内容的哈希(例如md5_file)结合起来,它将有效地工作。

于 2013-02-04T23:49:57.783 回答
5

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

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

我希望你可以自己做数据库。

于 2013-02-04T23:46:59.093 回答
5

也许你可以使用PHP 的filemtime()函数。简单地说,这个函数获取指定文件的文件修改时间。

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

$modifiedTs = filemtime($filename);
if ($modifiedTs != $lastModificationTs){
  echo "$filename was modified!";
}
于 2013-02-04T23:47:51.423 回答
3

我知道我会及时回到这里,但这个问题对我有帮助,所以我想分享我用它做了什么,所以虽然这不是问题的答案,但我会将其设为社区 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 来贡献你的改编。

于 2019-08-18T22:14:22.643 回答
2

最简单的方法是比较 file_date - 您可以使用filemtime

于 2013-02-04T23:47:13.797 回答