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