fwrite () więcej niż 2 GiB? [duplikować]
To pytanie ma już tutaj odpowiedź:
Czy fopen () jest ograniczony przez system plików? 4 odpowiedziMam zestaw plików, które chcę połączyć (każdy reprezentuje część z pobrania wieloczęściowego).
Każdy podzielony plik ma rozmiar około 250 MB, a ja mam ich zmienną liczbę.
Moja logika konkatenacji jest prosta:
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);
}
Trochę mi zajęło śledzenie, ale najwyraźniej, gdy mam więcej niż 8 pojedynczych części (łącznie 2GiB), mój plik wyjściowy zostaje obcięty do 2147483647 bajtów (zgłaszane przezsprintf('%u', $output)
).
Przypuszczam, że wynika to z 32-bitowego wewnętrznego licznika używanego przezfopen()
lubfwrite()
.
Jak mogę obejść ten problem (najlepiej używając tylko PHP)?