【问题标题】:fwrite() more than 2 GiB? [duplicate]fwrite() 超过 2 GiB? [复制]
【发布时间】:2013-10-26 14:54:03
【问题描述】:

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

每个拆分后的文件大小约为 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)?

【问题讨论】:

  • 这个话题可能很有趣:stackoverflow.com/questions/4229534/…
  • @LajosVeres:谢谢,现在阅读。
  • @LajosVeres:我想我正在运行 32 位安装(稍后会检查),但这仍然有点奇怪,因为我的文件上限为 2GiB 而不是 4GiB。由于没有负文件偏移之类的东西,我假设 fopen() / fwrite() 足够聪明,可以使用无符号 32 位整数并允许我最多写入 4GiB(在这种情况下就足够了)。
  • @Sammitch:这是错误的。 PHP 在所有版本的 Windows 上仅使用 32 位整数。在 Linux 上,尽可能使用 64 位整数。这是由于用于 Windows 版本的编译器的限制,如邮件列表中所述:marc.info/?l=php-internals&m=137002754604365&w=2
  • @Sven 撤回。对于接收 2-4GB+ POST 请求,这是否也已修复?

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


【解决方案1】:

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

Linux

cat file1.txt file2.txt  > file.txt

窗户

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2018-06-12
    • 2011-09-27
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多