Как определить, прервал ли пользователь download?

Ямерт

The Old One
Как определить, прервал ли пользователь download?

Другими словами, я хочу узнать, можно ли средствами PHP/Apache получить информацию о том, скачал ли пользователь файл до конца, или нет.
Скачивание осуществляется через протокол HTTP.
 
Re: Как определить, прервал ли пользователь download?

лог апача
там показывает сколько было отдано...
 
Т.е. нельзя получить эту информацию сразу после скачивания?
К примеру, я выдаю файл через функции PHP.

Нет ли какой-нибудь функции PHP для таких целей, которая позволяет получить данные об успехе скачивания?
 
если данные отдаються твоим скриптом,
то можешь поэксперементировать с connection_aborted()

и попробуй почитать раздел Connection handling в мануале,
может поможет
 
Проблему удалось решить без обращения к логам Апача.

Если кого-то интересует решение, вот оно:

PHP:
set_time_limit(0);
$filename = "file.mp3";

	query("INSERT INTO download (file,size,time,operation) VALUES ('$filename','',now(),'started')");

	header("Content-Type: audio/mpeg"); 
	header("Content-transfer-encoding: binary"); 
	$fp=fopen($filename, "r");
	$res = fpassthru($fp); 
	query("INSERT INTO download (file,size,time,operation) VALUES ('$filename','$res',now(),'finished')");

Если пользователь прервал скачивание, либо сама коннекция оборвалась, вторая запись не занесётся в базу. Разумеется, это всего лишь набросок - работу с базой надо продумать и оптимизировать.

Может, кому-то это поможет с решением похожей проблемы.
 
это фигня, которая работать не будет, ни на практике, не исходя из теоретических соображений
 
Если это фигня, подскажите, пожалуйста, как реализовать это решение, чтобы оно не было "фиговым".
 
Развивая твой скрипт - обновлять что скачали каждые парочку килобайт. Сервак жалко, конечно. Ну да ничего, и не такое держит.

Что то более путное в голову не лезет, а думать влом.
 
Развивая твой скрипт - обновлять что скачали каждые парочку килобайт. Сервак жалко, конечно. Ну да ничего, и не такое держит
У меня именно так всё и работает вместе с connection_aborted(). Обновляю я каждые 8192байт., ну и погрешность сколько закачал юзер соответственно.

Если интересны подробности можно в мыло. Но вроде и так всё понятно.
 
Меня только интересует, почему эта фигня работает :))
Т.е. при обрыве соединения код после fpassthru() не выполняется.
Можно ведь предусмотреть работу PHP при обрыве соединения со стороны клиента. Я не игнорирую это прерывание соединения, следовательно, скрипт при обрыве заканчивает выполнение.
 
Ямерт:
В твоем примере нужно строчку
PHP:
 query("INSERT INTO download (file,size,time,operation) VALUES ('$filename','$res',now(),'finished')");
поместить в отдельную функцию и обьявить ее в
register_shutdown_function.
 
Автор оригинала: LexeY
Ямерт:
В твоем примере нужно строчку
PHP:
 query("INSERT INTO download (file,size,time,operation) VALUES ('$filename','$res',now(),'finished')");
поместить в отдельную функцию и обьявить ее в
register_shutdown_function.
Тоже вариант.
Главное - при обрыве соединения, и при отсутсвии игнорирования обрыва этого соединения клиентом можно это засечь, не читая из файла в цикле, там же проверяя статус коннекции; а также не обращаясь к логам Апача. Это не чушь, и работает как теоретически, так и практически.
 
Сверху