fwrite()超过2 GiB?

时间:2013-10-17 22:10:21

标签: php file-io fopen 32-bit fwrite

我有一组我要连接的文件(每个文件代表多部分下载的一部分)。

每个拆分文件的大小约为250MiB,我的数量可变。

我的连接逻辑很简单:

if (is_resource($handle = fopen($output, 'xb')) === true)
{
    foreach ($parts as $part)
    {
        if (is_resource($part = fopen($part, 'rb')) === true)
        {
            while (feof($part) !== true)
            {
                fwrite($handle, fread($part, 4096));
            }

            fclose($part);
        }
    }

    fclose($handle);
}

我花了一段时间来追踪它,但显然,每当我有超过8个单独的部分(总共2GiB)时,我的输出文件被截断为2147483647字节(由sprintf('%u', $output)报告)。

我想这是由fopen()fwrite()使用的某种32位内部计数器造成的。

如何解决此问题(最好只使用PHP)?

1 个答案:

答案 0 :(得分:2)

作为解决方法,您可以使用shell。如果代码必须是可移植的,那么这只包括Windows和Linux的两种变体(也包括MacOS)。

Linux的

cat file1.txt file2.txt  > file.txt

Windows

copy file1.txt+file1.txt file.txt

请注意,在创建命令行时,转义变量参数非常重要。使用escapeshellarg()包装文件名(请参阅http://de1.php.net/escapeshellarg)。

要检测您是在Windows还是Linux上,请查看常量PHP_OS。 (这里最好解释:http://www.php.net/manual/en/function.php-uname.php