連結したい一連のファイルがあります (それぞれがマルチパート ダウンロードの一部を表します)。
分割された各ファイルのサイズは約 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()
これは、 orで使用されるある種の 32 ビット内部カウンターによるものだと思いますfwrite()
。
この問題を回避するにはどうすればよいですか (できれば PHP のみを使用してください)。