PHPx64仍然返回错误的文件大小
我正在尝试获取大于2GB的文件大小,但无论是64位还是32位版本,PHP都可能存在问题。在64位操作系统的64位处理器上运行的PHP 64位版本上,它仍然使用filesize函数返回错误的文件大小。在我遇到它返回一个负数,或者什么都没有之前。。。如果文件大小正在更改,则该数字会更改,但对于大于2gb的文件,该数字不准确。。。如果php使用32位整数,我可以理解一个小于实际大小的数字,零甚至负数,但正如我所读到的,PHP64位应该支持大于2gb的文件大小 我还尝试使用fseek结束和ftell,如:PHPx64仍然返回错误的文件大小,php,size,filesize,Php,Size,Filesize,我正在尝试获取大于2GB的文件大小,但无论是64位还是32位版本,PHP都可能存在问题。在64位操作系统的64位处理器上运行的PHP 64位版本上,它仍然使用filesize函数返回错误的文件大小。在我遇到它返回一个负数,或者什么都没有之前。。。如果文件大小正在更改,则该数字会更改,但对于大于2gb的文件,该数字不准确。。。如果php使用32位整数,我可以理解一个小于实际大小的数字,零甚至负数,但正如我所读到的,PHP64位应该支持大于2gb的文件大小 我还尝试使用fseek结束和ftell,如
$a = fopen("c:\big.txt", 'r');
fseek($a,0,SEEK_END);
$fs = ftell($a);
fclose($a);
echo $fs;
但是这只会给0…为什么不直接使用filesize函数呢
echo filesize('c:\big.txt');
此函数可能无法在32位系统上正常工作,但应在64位系统上为您提供正确的大小:
注意:由于PHP的整数类型是有符号的,并且许多平台使用32位整数,因此对于大于2GB的文件,某些文件系统函数可能会返回意外的结果
手册上说这可能在你的平台上被破坏。哦,太糟糕了 此评论可能有帮助:。它与您尝试的类似,但似乎认为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;
}
免责声明:我没有试过这个。我想OP已经试过了。该函数文档中的注释指出,对于大于2GB的文件,某些文件系统函数可能会返回意外结果。您提到文件大小正在更改。是否有另一个进程附加到该文件?如果是这样,请在调用filesize:之前尝试执行clearstatcache:看起来很有趣,但是,当我尝试它时,它一直循环,直到被30秒的限制停止。。我假设,即使它有效,它也需要很长时间才能在使用中被接受。。。我需要一个功能,将有点效率,因为它将处理大量的文件…我能想到的唯一可靠的方法是创建一个第三方控制台应用程序,接受一个文件名作为参数,然后让它通过PHP脚本,但即使我这样做,PHP是否能够处理长整数?如果$size>=900000000,像一个简单的函数吗?此外,现在脚本将被锁定在一个平台上,这甚至不考虑使用第三方通行证的性能损失,尽管……本页可能有更好的答案: