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

Ямерт

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

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

trent

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

лог апача
там показывает сколько было отдано...
 

Ямерт

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

Нет ли какой-нибудь функции PHP для таких целей, которая позволяет получить данные об успехе скачивания?
 

f1

formula 1
если данные отдаються твоим скриптом,
то можешь поэксперементировать с connection_aborted()

и попробуй почитать раздел Connection handling в мануале,
может поможет
 

Ямерт

The Old One
Проблему удалось решить без обращения к логам Апача.

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

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')");
Если пользователь прервал скачивание, либо сама коннекция оборвалась, вторая запись не занесётся в базу. Разумеется, это всего лишь набросок - работу с базой надо продумать и оптимизировать.

Может, кому-то это поможет с решением похожей проблемы.
 

DiMA

php.spb.ru
Команда форума
это фигня, которая работать не будет, ни на практике, не исходя из теоретических соображений
 

Ямерт

The Old One
Если это фигня, подскажите, пожалуйста, как реализовать это решение, чтобы оно не было "фиговым".
 

Alien

Новичок
Развивая твой скрипт - обновлять что скачали каждые парочку килобайт. Сервак жалко, конечно. Ну да ничего, и не такое держит.

Что то более путное в голову не лезет, а думать влом.
 

LexeY

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

Если интересны подробности можно в мыло. Но вроде и так всё понятно.
 

Ямерт

The Old One
Меня только интересует, почему эта фигня работает :))
Т.е. при обрыве соединения код после fpassthru() не выполняется.
Можно ведь предусмотреть работу PHP при обрыве соединения со стороны клиента. Я не игнорирую это прерывание соединения, следовательно, скрипт при обрыве заканчивает выполнение.
 

LexeY

Guest
Ямерт:
В твоем примере нужно строчку
PHP:
 query("INSERT INTO download (file,size,time,operation) VALUES ('$filename','$res',now(),'finished')");
поместить в отдельную функцию и обьявить ее в
register_shutdown_function.
 

Ямерт

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