PHP处理大量数据

时间:2014-08-02 17:39:17

标签: php int

我正在编写一个可以流式传输视频的应用程序。它需要视频的文件大小,所以我使用这段代码:

$filesize = sprintf("%u", filesize($file));

然而,当流式传输6演出的电影时,它失败了。

是否有可能在PHP中获得更大的整数值?如果我必须使用第三方库,我不在乎,如果它很慢,我所关心的是它可以正确地获取文件大小。

仅供参考,$filesize目前是3017575487,实际上真的非常远离6000000000,这大致是正确的。

我在64位操作系统上运行PHP。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

这里的问题是双重的。

问题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);


问题2


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); 
?>