我正在编写一个可以流式传输视频的应用程序。它需要视频的文件大小,所以我使用这段代码:
$filesize = sprintf("%u", filesize($file));
然而,当流式传输6演出的电影时,它失败了。
是否有可能在PHP中获得更大的整数值?如果我必须使用第三方库,我不在乎,如果它很慢,我所关心的是它可以正确地获取文件大小。
仅供参考,$filesize
目前是3017575487,实际上真的非常远离6000000000,这大致是正确的。
我在64位操作系统上运行PHP。
感谢您的任何建议!
答案 0 :(得分:1)
这里的问题是双重的。
filesize
函数返回有符号整数,最大值为PHP_INT_MAX
。在32位PHP上,此值为2147483647
或大约2GB。在64位PHP上你可以走得更高,最高可达9223372036854775807
。根据{{3}}的评论,我创建了一个函数,它将使用fseek
循环来查找文件的大小,并将其作为float
返回,它可以计算得更高一个32位的unisgned整数。
function filesize_float($filename)
{
$f = fopen($filename, 'r');
$p = 0;
$b = 1073741824;
fseek($f, 0, SEEK_SET);
while($b > 1)
{
fseek($f, $b, SEEK_CUR);
if(fgetc($f) === false)
{
fseek($f, -$b, SEEK_CUR);
$b = (int)($b / 2);
}
else
{
fseek($f, -1, SEEK_CUR);
$p += $b;
}
}
while(fgetc($f) !== false)
{
++$p;
}
fclose($f);
return $p;
}
要使用上述函数将文件的文件大小作为浮点数获取,您可以这样调用它。
$filesize = filesize_float($file);
在PHP filesize
page函数中使用%u
将导致它将参数解释为无符号整数,从而在溢出之前将32位PHP上的最大可能值限制为4294967295
。因此,如果我们要执行以下操作,则会返回错误的数字。
sprintf("%u", filesize_float($file));
您可以使用%F
将值解释为float,使用以下内容,但会产生尾随小数。
sprintf("%F", filesize_float($file));
例如,上面的内容会返回6442450944.000000
,而不是6442450944
。
解决方法是让sprintf
将float解释为字符串,然后让PHP将float转换为字符串。
$filesize = sprintf("%s", filesize_float($file));
这会将$filesize
设置为6442450944
之类的值,而不会跟踪小数。
如果您在代码中添加上面的filesize_float
函数,则可以使用以下代码行将实际文件大小读入sprintf
语句。
$filesize = sprintf("%s", filesize_float($file));
答案 1 :(得分:0)
根据64位平台的PHP docuemnation,这对于获取文件的文件大小而言似乎非常可靠> 4GB
<?php
$a = fopen($filename, 'r');
fseek($a, 0, SEEK_END);
$filesize = ftell($a);
fclose($a);
?>