在 PHP 开发过程中,文件操作是常见的需求之一,尤其是在处理上传、下载、日志管理、缓存清理等功能时,经常需要对文件的属性进行读取和判断。其中,获取文件大小是一个基础但至关重要的操作。PHP 提供了内置函数 filesize(),专门用于返回指定文件的字节大小。
虽然 filesize() 使用简单,但如果对其工作原理、返回值特性及使用限制理解不足,可能会导致程序出现错误或异常。例如,当文件不存在或权限不足时,该函数不会返回 0,而是返回 false,若未正确处理这一情况,可能引发后续逻辑错误。
本文将全面解析 filesize() 函数的基本语法、使用方法、返回值含义、常见应用场景以及实际开发中的注意事项,帮助开发者安全、高效地使用该函数。
filesize() 是 PHP 内置的一个文件系统函数,其作用是获取一个文件的大小(以字节为单位)。它的函数原型如下:
int|false filesize ( string $filename )
参数说明:
$filename 是要检查的文件路径,可以是相对路径或绝对路径,支持本地文件和部分封装协议(如 file://)。
返回值说明:
成功时返回文件大小(整数类型),单位为字节;如果文件不存在、路径无效或因权限问题无法访问,则返回布尔值 false。
基本使用示例:
$filePath = 'example.txt';
if (file_exists($filePath)) {
$size = filesize($filePath);
if ($size !== false) {
echo "文件大小为:{$size} 字节";
} else {
echo "无法读取文件大小,可能权限不足。";
}
} else {
echo "文件不存在。";
}
在这个例子中,我们首先通过 file_exists() 判断文件是否存在,再调用 filesize() 获取其大小,并通过比较是否为 false 来判断是否获取成功。
尽管 filesize() 返回的是整数,但由于文件大小可能非常大(如超过 2GB),在 32 位系统上,PHP 的整数范围有限(通常为 -2,147,483,648 到 2,147,483,647),因此对于大于 2GB 的文件,filesize() 可能返回负数或不准确的结果。
示例:
$largeFile = '/path/to/large_video.mp4';
$size = filesize($largeFile);
// 在 32 位系统上,结果可能是负数
var_dump($size); // 输出类似 int(-2147483648)
⚠ 注意:这并不是函数出错,而是整数溢出的表现。
此外,很多开发者误以为“文件大小为 0”等同于“获取失败”,但实际上:
文件内容为空时,filesize() 返回 0;
文件不存在或不可读时,返回 false。
因此,必须使用全等运算符 !== 进行判断,避免类型转换带来的逻辑错误:
if ($size === false) {
// 获取失败
} else {
// 成功获取,即使 size 为 0 也属于正常情况
}
filesize() 不仅适用于普通磁盘文件,还支持多种流封装协议,但并非所有协议都可用。
支持的情况:
本地文件:/var/www/html/data.log 或 ./upload/image.jpg
file:// 协议:file:///home/user/config.ini
不支持的情况:
远程 URL:http://example.com/file.zip —— 调用会失败并返回 false
目录路径:传入目录名而非文件路径会导致错误
已打开的文件资源:不能直接对 fopen() 返回的句柄使用 filesize()
如果需要获取远程文件大小,可通过发送 HTTP HEAD 请求并读取 Content-Length 头来实现:
$headers = get_headers('https://example.com/file.pdf', 1);
if (isset($headers['Content-Length'])) {
$size = (int)$headers['Content-Length'];
echo "远程文件大小:{$size} 字节";
}
控制文件上传大小
在文件上传表单中,常需验证文件是否超出限制:
if ($_FILES['upload']['error'] === UPLOAD_ERR_OK) {
$tmpFile = $_FILES['upload']['tmp_name'];
$maxSize = 5 * 1024 * 1024; // 5MB
if (filesize($tmpFile) > $maxSize) {
unlink($tmpFile);
die("文件过大,不允许上传。");
}
move_uploaded_file($tmpFile, 'uploads/' . $_FILES['upload']['name']);
}
显示人性化文件大小
原始字节数不利于阅读,可结合 filesize() 编写格式化函数:
function formatSize($bytes) {
$units = ['B', 'KB', 'MB', 'GB'];
$size = $bytes;
$unitIndex = 0;
while ($size >= 1024 && $unitIndex < 3) {
$size /= 1024;
$unitIndex++;
}
return round($size, 2) . ' ' . $units[$unitIndex];
}
echo formatSize(filesize('document.docx')); // 输出如 "2.34 MB"
日志清理与监控
定期检查日志文件大小,防止占用过多磁盘空间:
$logFile = 'app.log';
if (filesize($logFile) > 100 * 1024 * 1024) { // 超过 100MB
file_put_contents($logFile, ""); // 清空日志
error_log("日志文件过大,已自动清空。");
}
始终检查文件是否存在
在调用 filesize() 前建议先使用 file_exists() 和 is_file() 验证路径有效性。
注意权限问题
Web 服务器用户(如 www-data)必须对目标文件有读取权限,否则返回 false。
避免在大文件上频繁调用
虽然 filesize() 性能较高,但在循环中反复调用仍可能影响效率,建议缓存结果。
64 位系统更安全
若需处理大于 2GB 的文件,请确保运行环境为 64 位 PHP,以避免整数溢出。
不要用于实时流或设备文件
如 /dev/urandom 等特殊文件,其大小无意义,调用可能导致不可预期行为。
filesize() 是 PHP 中最常用且高效的文件大小获取函数,结构简洁、调用方便,广泛应用于文件管理、上传控制、系统监控等多个领域。然而,其返回值的特殊性(成功返回整数,失败返回 false)要求开发者必须进行严谨的条件判断,防止因疏忽导致程序异常。
声明:所有来源为“澳门太阳集团城网址8722”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
查询台风信息和台风路径
查询国家预警信息发布中心发布的气象预警信息,如:台风、暴雨、暴雪、寒潮、大风、沙尘暴、高温、干旱、雷电等预警类型及预警等级、时间等信息。
支持全球200多个国家或地区,以及国内三网运营商基站位置信息数据查询。
强大的数据积累,依托海量的数据,返回内容丰富度高,包含url、网页标题、正文摘要等,在需要时能够实时访问互联网信息,从而突破信息壁垒,实现更精准、更全面的输出。
通过出发地、目的地、出发日期等信息查询航班信息。