stream_copy_to_stream() 高效複製串流資料,不將整個檔案載入記憶體,適合大檔案複製。
function streamCopy($src, $dest): int|false {
$fsrc = fopen($src, 'rb');
$fdest = fopen($dest, 'wb');
if (!$fsrc || !$fdest) return false;
$bytes = stream_copy_to_stream($fsrc, $fdest);
fclose($fsrc);
fclose($fdest);
return $bytes;
}
function streamCopyProgress($src, $dest, callable $progress = null): int {
$fsrc = fopen($src, 'rb');
$fdest = fopen($dest, 'wb');
$total = fstat($fsrc)['size'] ?? 0;
$copied = 0;
$bufferSize = 8192;
while (!feof($fsrc)) {
$buffer = fread($fsrc, $bufferSize);
fwrite($fdest, $buffer);
$copied += strlen($buffer);
if ($progress) $progress($copied, $total);
}
fclose($fsrc);
fclose($fdest);
return $copied;
}
掌握串流複製,大檔案操作不再記憶體爆滿。