绝大多数情况是调用前提未满足:路径含转义字符(如双引号中被解释为垂直制表符)、中文路径编码不匹配(旧php+gbk环境)、或32位php下文件超2gb导致溢出,filesize()仅发e_warning而不报错,易被忽略。

filesize() 获取不到文件大小,绝大多数情况不是函数本身坏了,而是调用前提没满足——它对输入极其敏感,且不报错(只发 E_WARNING),容易被忽略。
路径里有转义字符(比如 、
)就直接失效
双引号字符串中 会被解释为垂直制表符,导致实际传给 filesize() 的路径根本不存在。例如:
$path = "F:s2017projectile.txt"; // 变成控制字符,路径错乱
结果就是 stat failed for F:s2017projectile.txt 这类错误。
- 用单引号避免自动转义:
$path = 'F:s2017projectile.txt'; - 或统一用正斜杠(Windows 也支持):
$path = 'F:/vs2017/project/file.txt'; - 若必须拼接,用
str_replace('\', '/', $path)预处理
中文路径在旧 PHP 版本下直接报错
PHP 7.1 之前,filesize() 内部调用系统 stat() 时,若文件路径含 UTF-8 编码的中文,而当前 locale 不匹配(如 Windows 默认 GBK),就会失败。
- PHP iconv('UTF-8', 'GBK', $filename) 转码再传入
- PHP ≥ 7.1:原生支持 UTF-8 路径,无需转码(但需确保 Web 服务器和终端编码一致)
- 验证方式:
var_dump(file_exists($filename));若返回false但文件明明存在,大概率是编码问题
传了目录、符号链接或权限不足,却没做判断
filesize() 对目录永远返回 false;对不可读文件、损坏软链、NFS 挂载异常等情况,也一律返回 false 并触发警告。
- 必须前置校验:
is_file($path) && is_readable($path) - 别直接累加:
foreach ($files as $f) $total += filesize($f);—— 一旦某个$f是目录,filesize()返回false(即0),总和就错 - 生产环境建议静默容错:
$size = @filesize($path) ?: 0;,配合日志记录异常路径
文件 >2GB 且运行在 32 位 PHP 上
32 位整数最大值约 2.1GB(PHP_INT_MAX ≈ 2147483647),超过后 filesize() 可能返回负数、截断值或 false,这不是 bug,是底层限制。
- 检查环境:
echo PHP_INT_SIZE === 8 ? '64-bit' : '32-bit'; - PHP
- 替代方案(仅限本地大文件):
exec("stat -c '%s' " . escapeshellarg($path), $out) && (int)$out[0](Linux)或exec("for %i in (" . escapeshellarg($path) . ") do @echo %~zi", $out)(Windows)
真正麻烦的从来不是“怎么写”,而是“为什么明明路径对、文件在、权限够,它还是返回 false”。多数时候,filesize() 的沉默比报错更难调试——它依赖 clearstatcache() 清缓存、依赖路径字节级正确、依赖系统层 stat 调用成功。哪怕只是多了一个不可见的 BOM 或换行符,都可能让整个调用链失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











