在文件缓存过期的问题上,是用哪个函数合适呢?
fileatime --取得文件上一次访问的时间
int fileatime ( string $filename
)
返回文件上次被访问的时间, 或者在失败时返回 FALSE
。时间以 Unix 时间戳的方式返回。
Note:
注意:不同文件系统对时间的判断方法可能是不相同的。
filemtime --取得文件修改时间
int filemtime ( string $filename
)
本函数返回文件中的数据块上次被写入的时间,也就是说,文件的内容上次被修改的时间。
filectime --取得文件inode修改时间
int filectime ( string $filename
)
Note:
注意:在大多数 Unix 文件系统中,当一个文件的 inode 数据被改变时则该文件被认为是修改了。也就是说,当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时。参见 filemtime()(这才是你想用于在 Web 页面中建立“最后更新时间”脚注的函数)和 fileatime()。
Note:
注意某些 Unix 说明文本中把 ctime 说成是该文件建立的时间,这是错的。在大多数 Unix 文件系统中没有 Unix 文件的建立时间。
Note: 此函数的结果会被缓存。参见 clearstatcache() 以获得更多细节。
下面分别在windows下和在linux下的区别:
在window下:
<?php$filename='./tt.txt';
echo 'fileatime:'.date('Y-m-d H:i:s',fileatime($filename)).'<br>';
echo 'filectime:'.date('Y-m-d H:i:s',filectime($filename)).'<br>';
echo 'filemtime:'.date('Y-m-d H:i:s',filemtime($filename)).'<br>';
?>
分别做一下操作:
初始状态:
fileatime:2017-12-11 11:11:06
filectime:2017-12-11 11:10:49
filemtime:2017-12-11 11:40:02
修改但是内容不变
fileatime:2017-12-11 11:11:06
filectime:2017-12-11 11:10:49
filemtime:2018-06-13 11:23:38
修改并改变内容
fileatime:2017-12-11 11:11:06
filectime:2017-12-11 11:10:49
filemtime:2018-06-13 11:24:45
可以看到不管有没有修改文件的原内容 filemtime都会发生改变 而其他都不会改变(不确定是不是有缓存);
2.在linux中
还是跟上面一样的测试代码,结果如下
初始状态:
fileatime:2018-06-13 03:19:32filemtime:2018-06-13 03:19:32filectime:2018-06-13 03:19:32
修改但是内容不变fileatime:2018-06-13 03:36:10filemtime:2018-06-13 03:36:10filectime:2018-06-13 03:36:10修改并改变内容fileatime:2018-06-13 03:36:45filemtime:2018-06-13 03:36:45filectime:2018-06-13 03:36:45
改变文件所属
fileatime:2018-06-13 03:36:45
filemtime:2018-06-13 03:36:45
filectime:2018-06-13 03:38:31
结论:在linux中fileatime为文件的上一次访问时间,filemtime为上一次文件的修改时间(不管你有没有改变原来的内容),而filectime则是对应着上一次文件的inode节点改变的时间,比如改变所属组,拥有者,文件内容等filectime都会相应的发生改变。所以在判断缓存文件是否过期的问题上应该要使用filemtime比较合理!
Note:在linux中ll指令也会有一个文件操作相关的时间,那么这个时间是哪个函数的时间呢?一试便知!
实验之前的数据:
看文件client.php的时间为 6-13 11:36
为了让访问时间不跟修改时间重复,采用以下指令实现不访问文件的方式对文件内容坐出修改
echo 'echo '123''>>client.php 将echo '123'代码写入client.php中
此时ll查看client.php状态:
ll出来的信息已经发生了更改,那么用之前的代码查看下该文件:
输出结果如下:
显示的结果跟filemtime和filectime是一致的(由于时区问题差了八个小时),那么是哪个才对呢 ?
接下来改变文件的所属
chown vsftpd client.php
ll查看信息:
此时查看文件信息:
由此可见,ll指令显示文件信息的时间是filemtime的时间!