fileatime,filemtime,filectime

本文探讨了在PHP中如何利用filemtime、fileatime及filectime函数来判断文件的缓存状态,并通过Windows和Linux环境下的实测对比,推荐使用filemtime来确定文件是否已过期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在文件缓存过期的问题上,是用哪个函数合适呢?

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:32

filemtime:2018-06-13 03:19:32

filectime:2018-06-13 03:19:32


修改但是内容不变

fileatime:2018-06-13 03:36:10

filemtime:2018-06-13 03:36:10

filectime:2018-06-13 03:36:10

修改并改变内容

fileatime:2018-06-13 03:36:45

filemtime:2018-06-13 03:36:45

filectime: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的时间!


    







、填空题 1、使用fopen()函数打开文件后,返回值是(resource)数据类型。 2、file_put_contents()函数要实现追加写入,第3个参数应设为(FILE_APPEND)。 3、若要禁止打开远程文件,可以使用php.ini中的(allow_url_fopen)配置项来设置。 4、在PHP中,使用(filemtime(string $filename))获取文件的修改时间。 5、在PHP中,若要实现文件下载,需将header()函数中Content-Disposition的值设为(attachment)。 二、判断题 1、在PHP中,dirname()函数用于返回路径中的目录部分。(√) 2、php.ini中的open_basedir无法限制include()函数的访问路径。(×)(可以限制) 3、file_get_contents()函数支持访问远程文件。(√) 4、语句"rmdir(‘path1/path2’)“的执行目的就是递归删除path2和path1。(×)(删除非空目录时,会删除失败) 5、在遍历任何目录时,返回值中都会包括”.“和”…"这两个特殊的目录。(×)(根目录不可) 三、选择题 1、PHP中用于判断文件是否存在的函数是(B)。 A、fileinfo() B、file_exists() C、fileperms() D、filesize() 2、fileatime()函数能够获取的文件属性是(C)。 A、创建时间 B、修改时间 C、上次访问时间 D、文件大小 3、下列选项中,可以实现将一个文件复制到另一个文件或目录下的函数是(D)。 A、rename() B、move_uploaded_file() C、link() D、copy() 4、下列选项中,可以删除文件的函数是(B)。 A、rename() B、unlink() C、rmdir() D、fclose() 5、下列选项中,可以将文件中的内容读入数组中的函数是(A)。 A、file() B、fgets() C、file_get_contents() D、fgetc() 四、简答题 1、请列举5个常用的文件操作函数 函数 功能 int filesize(string $filename) 获取文件大小 int filectime(string $filename) 获取文件的创建时间 int filemtime(string $filename) 获取文件的修改时间 int fileatime(string $filename) 获取文件的上次访问时间 bool is_readable(string $filename) 判断给定文件是否可读 bool is_writable(string $filename) 判断给定文件是否可写 bool is_executable(string $filename) 判断给定文件是否可执行 array stat(string $filename) 获取文件的信息 2、请简要说出超全局变量$_FLES获取上传文件信息后,各个元素键名及其作用 答:(1)name:表示文件名,是用户上传的文件在服务器上的名称。 (2)type:表示文件的MIME类型。 (3)tmp_name:表示临时文件路径,是服务器上存储上传文件的临时路径。 (4)error:表示错误代码,是一个整数值,表示上传过程中可能发生的错误。可能的错误代码包括但不限于:UPLOAD_ERR_OK(无错误)、UPLOAD_ERR_INI_SIZE(临时文件大小超过了php.ini中的设置)、UPLOAD_ERR_FORM_SIZE(表单大小超过了表单限制)、UPLOAD_ERR_PARTIAL(文件部分上传失败)等。 (5)size:表示文件大小(字节数)。 (6)headers:表示一个包含HTTP头信息的关联数组,当文件正在通过浏览器进行上传时有效。帮我记忆
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值