$dest = fopen($path, 'ab+');
flock($dest, LOCK_EX);
stream_copy_to_stream($source = fopen($url, 'rb'), $dest = fopen($path, 'ab+'));
fclose($source);
fclose($dest);
file_put_contents довольно паршивый вариант, т.к. выгружает в память сразу весь объём данных и при превышении допустимого всё упадёт. Лучше использовать рестриминг потока.
P.S. С другой стороны нужно бы посмотреть, кажется "http" враппер после хедшейка всё в буфер грузит сразу же, вместо использования чанкинга.