【发布时间】: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