filemtime 返回 0 或 false 主因是路径或权限问题;filesize 返回 0 常因文件被写入、符号链接未解析或大文件溢出;推荐用 stat() 一次性获取元数据并显式处理时区与单位。

filemtime 返回 0 或 false 的常见原因
当 filemtime 返回 0 或 false,基本不是函数本身出错,而是路径或权限问题。最常踩的坑是传入了相对路径但当前工作目录(getcwd())和预期不一致,比如在 Web 环境中脚本被 Apache/Nginx 以 www-data 用户运行,却尝试读取用户家目录下的文件。
实操建议:
- 始终用
realpath($path)检查路径是否真实存在且可访问 - 用
is_readable($path)显式判断读取权限,别依赖filemtime的返回值做逻辑分支 - 注意 Windows 下 NTFS 的“最后修改时间”可能受时区或文件系统缓存影响,若需高精度比对,应统一用 UTC 时间戳处理
- 如果文件刚创建就立刻调用
filemtime,某些 NFS 或容器挂载卷会出现延迟更新,建议加clearstatcache(true, $path)强制刷新
filesize 返回 0 但文件明明有内容
filesize 返回 0 不代表文件为空,更可能是 PHP 没拿到准确元数据。典型场景包括:文件被其他进程正在写入(如日志轮转中)、使用了符号链接但没开启 follow_symlinks、或文件大小超过 PHP_INT_MAX(32 位系统上约 2GB)导致整型溢出。
实操建议:
- 先用
is_file($path) && is_readable($path)双重校验,避免对目录或 socket 文件误调用 - 对大文件(>2GB),改用
stream_wrapper_register+ 自定义 wrapper 或直接调用stat($path)['size'](stat返回 float 类型,在 64 位系统更可靠) - 符号链接默认不跟随,如需获取目标文件大小,确保路径已用
realpath($path)解析,或启用stream_wrapper_register('symlink', ...)手动处理 - 在 CLI 模式下测试时,注意 umask 和 open_basedir 限制;Web 模式下还需检查
disable_functions是否禁用了filesize
同时获取修改时间和大小的性能优化方式
连续调用 filemtime($f) 和 filesize($f) 会触发两次 stat 系统调用,对高频访问(如列表页渲染)有明显开销。PHP 提供了 stat($path) 一次性读取全部元数据,其中 mtime 和 size 都包含在返回数组里。
实操建议:
- 优先用
$stat = stat($path); $mtime = $stat['mtime']; $size = $stat['size'];替代两次独立调用 - 注意
stat返回的键名是字符串(如'mtime'),不是常量STAT_MTIME;键名区分大小写,别写成Mtime - 若只需修改时间或大小之一,仍建议用原生函数——因为
stat开销略大,且 PHP 会对单次调用做内部缓存(clearstatcache影响所有相关函数) - 在循环中批量处理多个文件时,记得在循环外调用一次
clearstatcache(true)避免缓存污染,但不要在每次迭代里清空
时区与格式化输出的隐含陷阱
filemtime 返回的是 Unix 时间戳(UTC 秒数),直接传给 date() 会按服务器默认时区解释。如果页面面向多时区用户,或需要和数据库时间字段对齐,忽略时区会导致显示偏差甚至查询错乱。
实操建议:
- 用
date_create('@' . $timestamp)->setTimezone(new DateTimeZone('Asia/Shanghai'))显式指定时区,别依赖date_default_timezone_set - 存储时间戳到数据库前,确认字段类型是
INT或BIGINT,而非DATETIME——后者会自动转换时区,造成二次解析错误 - 前端展示时,若用 JS 处理时间(如
new Date(timestamp * 1000)),注意 PHP 时间戳是秒级,JS 是毫秒级,漏乘 1000 就差 8 小时 - 调试时用
var_dump($timestamp, date('c', $timestamp), date_default_timezone_get())三连查,比单看date()输出更可靠
实际项目里,filemtime 和 filesize 看似简单,但一旦混入符号链接、NFS、容器挂载、时区切换或大文件场景,出问题往往悄无声息。最稳妥的做法是:每调用前验证路径有效性,每次结果都做类型和范围检查,涉及展示或比较时显式处理时区和单位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











