+ -

PHP中获取文件大小函数filesize()详解

时间:2025-10-13

来源:互联网

标签: PHP教程

在手机上看
手机扫描阅读

在 PHP 开发过程中,文件操作是常见的需求之一,尤其是在处理上传、下载、日志管理、缓存清理等功能时,经常需要对文件的属性进行读取和判断。其中,获取文件大小是一个基础但至关重要的操作。PHP 提供了内置函数 filesize(),专门用于返回指定文件的字节大小。

虽然 filesize() 使用简单,但如果对其工作原理、返回值特性及使用限制理解不足,可能会导致程序出现错误或异常。例如,当文件不存在或权限不足时,该函数不会返回 0,而是返回 false,若未正确处理这一情况,可能引发后续逻辑错误。

本文将全面解析 filesize() 函数的基本语法、使用方法、返回值含义、常见应用场景以及实际开发中的注意事项,帮助开发者安全、高效地使用该函数。

一、filesize() 的基本语法与使用方式

filesize() 是 PHP 内置的一个文件系统函数,其作用是获取一个文件的大小(以字节为单位)。它的函数原型如下:

int|falsefilesize(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() 编写格式化函数:

    functionformatSize($bytes){
    $units=['B','KB','MB','GB'];
    $size=$bytes;
    $unitIndex=0;
    while($size>=1024&&$unitIndex<3){
    $size/=1024;
    $unitIndex++;
    }
    returnround($size,2).''.$units[$unitIndex];
    }
    echoformatSize(filesize('document.docx'));//输出如"2.34MB"
  • 日志清理与监控

  • 定期检查日志文件大小,防止占用过多磁盘空间:

    $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 等特殊文件,其大小无意义,调用可能导致不可预期行为。

    PHP中获取文件大小函数filesize()详解

    filesize() 是 PHP 中最常用且高效的文件大小获取函数,结构简洁、调用方便,广泛应用于文件管理、上传控制、系统监控等多个领域。然而,其返回值的特殊性(成功返回整数,失败返回 false)要求开发者必须进行严谨的条件判断,防止因疏忽导致程序异常。

    以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。

    今日更新