filemtime() 返回无时区的Unix时间戳,受服务器时区影响;符号链接和NFS下行为不稳定;应直接检查返回值而非前置校验;Windows下可能返回0或负数,须严格验证。

filemtime() 返回的是服务器本地时间,不是客户端时区
PHP 的 filemtime() 读取的是文件系统记录的 mtime(修改时间),这个值以 Unix 时间戳形式返回,**不带时区信息**。它反映的是文件最后一次被写入内容的时间,但这个时间戳在 PHP 中默认按服务器所在时区解释(比如 date('Y-m-d H:i:s', filemtime($path)) 输出的是服务器本地时间)。
常见错误现象:
— 开发环境显示 10:00,上线后变成 18:00(服务器时区是 UTC+8,但代码误以为是 UTC)
— 多地区部署时,缓存判断逻辑出错(比如用时间戳做版本号,结果因时区偏差导致重复刷新)
实操建议:
— 若需统一展示,显式设置时区:date_default_timezone_set('Asia/Shanghai')
— 若用于缓存控制或比较,直接用时间戳比对,避免格式化后再解析
— 不要依赖 filemtime() 做精确到秒的定时任务触发依据(文件系统精度可能为 1 秒或更低,ext4 默认是 1 秒,XFS 可达纳秒但 PHP 不暴露)
filemtime() 在 symlink 和 NFS 上行为不稳定
当路径指向符号链接时,filemtime() 默认返回**目标文件**的修改时间;但如果目标不存在或权限不足,会返回 false 并触发 warning。NFS 或某些网络存储(如 CIFS 挂载)可能因缓存策略导致返回过期时间戳。
常见错误现象:
— 本地开发正常,部署到容器或 NAS 后 filemtime() 总是返回旧值
— filemtime() 报 Warning:“No such file or directory”,但 is_file() 返回 true
— symlink 目标被替换后,仍读到原文件的 mtime
实操建议:
— 使用前加判断:if (is_file($path) && ($ts = @filemtime($path)) !== false)
— 对 symlink 敏感场景,改用 lstat($path)['mtime'] 获取链接自身元数据(注意:lstat() 不触发 warning,但需自己处理失败)
— NFS 环境下,考虑加 clearstatcache(true, $path) 强制刷新(但别滥用,有性能开销)
filemtime() 和 file_exists()、is_readable() 的调用顺序很重要
filemtime() 内部会触发一次文件系统查询。如果先调用 file_exists() 再调用 filemtime(),等于做了两次 stat 调用;而直接调用 filemtime() 并检查返回值是否为 false,更高效且语义一致——因为 false 已隐含“文件不存在/不可读”。
常见错误现象:
— 高频访问页面中,每请求多出一次系统调用,QPS 上升后 I/O 压力明显
— file_exists() 返回 true,但 filemtime() 返回 false(权限变化发生在两次调用之间)
实操建议:
— 单次判断优先用 filemtime() 自带的失败信号,不要前置校验
— 如需同时获取大小和修改时间,用 stat() 一次读全:$st = stat($path); $ts = $st['mtime']; $size = $st['size'];
— 避免在循环里反复调用 filemtime() 查同一文件,缓存结果
Windows 下 filemtime() 可能返回 0 或负数
Windows 文件系统(尤其是 FAT32)对时间戳支持较弱,创建时间、修改时间可能被截断或归零;NTFS 虽好些,但若文件由某些工具(如旧版 FTP 客户端、Git for Windows 的 checkout)生成,也可能丢失精度或写入非法值。
常见错误现象:
— filemtime() 返回 0 或负数(如 -1),导致 date() 输出 “1970-01-01”
— filemtime() 返回值在不同 Windows 版本间不一致(Win7 vs Win10 WSL2)
实操建议:
— 永远检查返回值:$ts = @filemtime($path); if ($ts === false || $ts
— 跨平台项目中,不要把 filemtime() 当作唯一版本标识,可结合 md5_file() 或文件大小做兜底
— 若必须强依赖时间戳,Windows 上建议改用 GetFileTime()(需扩展)或换用更稳定的存储方案(如数据库记录时间)
实际用的时候,最常掉坑的地方不是函数不会写,而是没意识到它背后连着操作系统、文件系统、时区、权限四层变量。哪怕一个 filemtime(),在容器里挂个 NFS、再切个时区,就可能让缓存失效逻辑整个跑偏。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











