Когда сервер отправляет файл, он не просто мгновенно передает данные по сети, есть пакеты ack, которые должны проходить между клиентом и сервером, отправляющим файл по одному фрагменту за раз.
Все, что нужно сделать - это иметь какой-то процесс, который отправляет файл пользователю управляемым способом, так что вы можете перехватить событие там, где «последний» блок файла сбрасывается пользователю.
Теперь предоставлено, что пользователь может никогда не получить этот последний блок, но если он запрашивает последний блок (что и делают ack-пакеты), то либо они, либо базовый сетевой протокол приняли, что они получили все блоки, предшествующие этому последнему блоку, и этот может перейти к отправке последнего блока.
Теперь предположим, что
- Ваш веб-сервер выполняет нет буферизации.
- Это когда ваш веб-сервер блокирует выполнение вашей программы, пока она передает передаваемую вами информацию.
Все, что нужно, - это простая конструкция, подобная этой: (Псевдокод).
1: Open File $foo;
2: Loop while $foo is not EOF
3: read 700kilobits from file $foo;
4: print 700kilobits of read data to web server
5: execute webserver 'flush' which blocks until flush is complete.
6: <-- Loop
7: If all chunks of 700kilobits were read before user aborted transaction
8: report file was downloaded.
Edit Unkwntech ответ практически совпадает с моим.
Его ответ, однако, специфичен для PHP, и я хотел предоставить более общее для языка решение, прежде всего, потому что я разработал отвращение к PHP и не хочу писать для него код, настраивать веб-сервер и тестировать его работу просто чтобы доказать точку зрения, которую я знаю по опыту работ.
Извиняюсь за то, что слишком ленив в этом отношении.