У меня ваш код заработал. Вместо вывода блоков данных поставил вывод их длины, в консоль посыпались размеры блоков.
<?php
header("Content-Disposition: attachment; filename=\"How to Use Git and GitHub Videos.zip\"");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";
$ch = curl_init();
ob_start();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024));
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
echo strlen($buffer)."\r\n";
ob_flush();
flush();
return strlen($buffer);
});
curl_exec ($ch);
curl_close($ch);
Возможно, не хватало явного
ob_start(). Если все равно нет, то смотрите настройки веб-сервера (например, в php.ini output_buffering = Off, zlib.output_compression = Off).