【问题标题】:PHP x64 still returns wrong filesizePHP x64 仍然返回错误的文件大小
【发布时间】:2014-06-16 21:53:10
【问题描述】:

我正在尝试获取 >2GB 的文件大小,但无论 64 位还是 32 位版本,PHP 都会出现问题。在 64 位操作系统上的 64 位处理器上运行的 PHP 64 位版本上,它仍然使用 filesize() 函数返回错误的文件大小。在我遇到它返回一个负数之前,或者什么都不返回......如果文件大小发生变化,这个数字会发生变化,但对于大于 2gb 的文件不准确......我可以理解一个小于实际大小的数字,如果 php 使用 32 位整数,则为零甚至负数,但正如我所读,php 64 位应该支持文件大小 > 2gb ...

我也尝试过使用 fseek 来结束和 ftell 喜欢:

$a = fopen("c:\big.txt", 'r');
fseek($a,0,SEEK_END);
$fs = ftell($a);
fclose($a);
echo $fs;

但这只会给 0...

【问题讨论】:

标签: php size filesize


【解决方案1】:

为什么不直接使用filesize 函数?

echo filesize('c:\big.txt');

此函数在 32 位系统上可能无法正常工作,但应该在 64 位系统上为您提供正确的大小:

注意:由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,某些文件系统函数可能会返回意外结果。

【讨论】:

  • 我认为 OP 已经尝试过了。该函数的文档中的注释说“某些文件系统函数可能会为大于 2GB 的文件返回意外结果。”
  • 您提到文件大小正在发生变化。文件中是否附加了另一个进程?如果是这样,请尝试在致电 filesize 之前执行 clearstatcache()php.net//manual/en/function.clearstatcache.php
【解决方案2】:

手册实际上说“这可能在您的平台上被破坏。哦,太糟糕了。”

此评论可能会有所帮助:http://us3.php.net/manual/en/function.filesize.php#113457。它与您尝试的类似,但似乎假设 SEEK_END 也不起作用。

function RealFileSize($fp)
{
    $pos = 0;
    $size = 1073741824;
    fseek($fp, 0, SEEK_SET);
    while ($size > 1)
    {
        fseek($fp, $size, SEEK_CUR);

        if (fgetc($fp) === false)
        {
            fseek($fp, -$size, SEEK_CUR);
            $size = (int)($size / 2);
        }
        else
        {
            fseek($fp, -1, SEEK_CUR);
            $pos += $size;
        }
    }

    while (fgetc($fp) !== false)  $pos++;

    return $pos;
}

免责声明:我没有尝试过。

【讨论】:

  • 看起来很有趣,但是,当我尝试它时,它会循环,直到它被 30 秒的限制停止。我假设即使它有效,它也需要很长时间才能被接受...我需要一个效率较高的函数,因为它会处理大量文件...
  • 我能想到的唯一“一种”可靠的方法是创建一个接受文件名作为参数的第三方控制台应用程序,然后让它通过 PHP 脚本,但即使我这样做那么,php 能够处理长整数吗?像一个简单的 if($size >=9000000000) ?此外,现在脚本将被锁定到一个平台,这甚至没有考虑使用第三方通行证的性能损失......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多