filemtime()返回false即失败,必须用!== false判断;成功返回unix时间戳,失败不返回0或空字符串,常见原因包括文件不存在、无读权限或路径错误。

filemtime 返回 false 就代表失败,不是 0
很多人看到 filemtime() 返回 false 还去判断 == 0 或直接用在 date() 里,结果报 Warning:“A non-numeric value encountered”。filemtime() 成功时返回整型时间戳(如 1725112680),失败时严格返回 false,不是 0,也不是空字符串。
正确判断方式只有这一种:
$timestamp = filemtime('config.php');
if ($timestamp !== false) {
echo date('Y-m-d H:i:s', $timestamp);
} else {
echo '无法获取修改时间';
}
- 必须用
!== false,不能用!= false或== false(PHP 类型松散比较会把0也当false) - 不检查就直接传给
date(),PHP 8+ 会抛ValueError,低版本则警告 + 输出错误日期 - 常见失败原因:文件不存在、路径写错、PHP 进程无读权限、符号链接指向无效路径
不加 file_exists() 也能用,但风险自己担
很多老代码省略 file_exists(),靠 filemtime() 自身返回 false 判断。这确实可行,但有副作用:
- 如果文件不存在,
filemtime()会触发E_WARNING(如Warning: filemtime(): stat failed for missing.txt),在 error_reporting 开启时会输出或记日志 - 某些共享主机禁用警告显示,看似“没报错”,实则错误被吞掉,调试困难
-
file_exists()是轻量级系统调用,比filemtime()开销更小,先查存在性反而更高效
推荐写法:
$path = '/var/www/data/cache.json';
if (!file_exists($path)) {
die('缓存文件丢失');
}
$ts = filemtime($path);
if ($ts === false) {
die('权限不足或文件被锁');
}
filemtime 的时间不准?先看这三个地方
filemtime() 返回的是文件系统记录的 mtime,它本身没错,但你看到的“不准”往往来自外部干扰:
-
NFS 或网络存储:挂载参数未启用
noac时,客户端缓存属性,filemtime()可能延迟数秒甚至分钟 -
PHP stat 缓存:同一请求中多次调用
filemtime()同一文件,PHP 默认复用上次结果;需手动调用clearstatcache(true, $path)强刷 -
服务器时区/时间不同步:PHP 默认用系统时区,但
date()格式化时若未设时区(如没调date_default_timezone_set('Asia/Shanghai')),可能显示成 UTC 时间,看起来“慢 8 小时”
验证是否真不准,可在终端执行:stat -c '%y' your_file.txt,对比输出和 PHP 中 date('c', filemtime(...)) 是否一致。
别拿 filemtime 当创建时间用
filemtime() 只反映「内容最后一次被写入」的时间,跟文件创建无关。Windows 下 filectime() 才是创建时间;Linux/macOS 下 filectime() 是 inode 属性变更时间(如改权限、改属主),不是创建时间——这些系统压根不存创建时间。
- 需要“首次生成时间”?得自己在写文件时用
touch()或写入元数据到 JSON/DB - 想判断哪个文件更新:用
filemtime()比较两个文件时间戳即可,但注意跨时区部署时统一用 UTC 时间戳比较 - 缓存场景常用组合:
time() - filemtime($cache_file) > 300判断缓存是否过期 5 分钟
真正容易被忽略的点是:filemtime() 不支持 HTTP URL(如 filemtime('https://example.com/data.json')),只认本地文件路径。远程文件得先 file_get_contents() 下来,或用 cURL 获取 Last-Modified 响应头。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











