Значит это буферизация.А readfile() выполняется меньше секунды и всегда возвращает размер картинки. Вот такая штука.
Там в комментах на странице мануала по fpassthru куча примеров. Еще надо ignore_user_abort вызвать, чтобы если прервется связь - снять блокировку.Steamroller а примерчик можно, я что-то не очень пойму, по идеи readfile всегда выдает полный размер файла, его в цикл нужно заключать?
Либо php-шный output buffering, либо какая-то прозрачная прокся между сервером и клиентом например.буферизация чего и где? output buffering?
А попробуй в этот код добавить вывод чего-либо (echo "Hello world!") перед циклом sleep, и проверить.в том-то и дело, что не работает не именно connection_aborted(), а вообще определение обрыва связи. можно проверить
set_time_limit(10);
ignore_user_abort(false);
register_shutdown_function('shd');
while (true) {
sleep(1);
}

Ну смотришь значение заголовка, fseek'ом устанавливаешь начало диапазона, и fpassthru с этого дескриптора вызываешь.похоже здесь нужно искать не прерывание соединения,а обрабатывать заголовки с Range, только не знаю как?
ignore_user_abort(true);
set_time_limit(0);
ini_set("output_buffering", "Off");
$my_file = "./files/file.pdf";
if ($fd = fopen ($my_file, "rb")) {
$fname = basename ($my_file);
header("Pragma: ");
header("Cache-Control: ");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$fname."\"");
header("Content-length: $fsize");
header("Connection: close");
system("echo starting. >> ./files/fpass2.log");
fpassthru($fd);
system("echo done. >> ./files/fpass2.log");
}
.
.
.