[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отследить процесс скачивания файлы
vriadchenko
Привет.

есть ли у PHP возможность отслеживать процесс скачивания пользователем файла?
Т.е. пользователь по урлу скриптом получает поток с файлом и я хочу знать сколько он уже скачал на данный момент.



Спустя 50 минут, 38 секунд (24.06.2009 - 08:35) sergeiss написал(а):
ПХП формирует страницу на сервере, может в процессе общаться с сервером. Но про юзера, про то, что он скачивает, ПХП не знает и знать не может.

Это то же самое, что требовать от производителей автомобилей отчета о том, где находятся произведенные ими автомобили, кто на них ездит, кто что делает. И всё это в реальном времени! Реально?

Спустя 18 минут, 4 секунды (24.06.2009 - 08:53) vriadchenko написал(а):
Цитата (sergeiss @ 24.06.2009 - 05:35)
ПХП формирует страницу на сервере, может в процессе общаться с сервером. Но про юзера, про то, что он скачивает, ПХП не знает и знать не может.

В том то и дело что PHP формирует этот ответ юзеру, он же читает файл с диска и порциями отдает юзеру в выходной поток. Единственная загвоздка в процессе вывода данных из файла в поток юзера выяснить сколько байт уже ушло юзеру или считалось из входного файла.

Спустя 23 минуты, 12 секунд (24.06.2009 - 09:16) sergeiss написал(а):
Скачивание файла и создание страницы - это разные действия, разные протоколы. ПХП к скачиванию файла не имеет никакого отношения.

Спустя 23 минуты, 9 секунд (24.06.2009 - 09:39) vasa_c написал(а):
Цитата
он же читает файл с диска и порциями отдает юзеру в выходной поток

И что, на этом этапе нельзя выяснить сколько ушло?

Спустя 19 минут, 40 секунд (24.06.2009 - 09:59) twin написал(а):
А мне другое интересно. Что значит
Цитата
я хочу знать сколько он уже скачал на данный момент.

То есть в онлайн-режиме следить за процессом? А если их много, процессов? И как вообще... Что делать с данными, даже если их удасться получить?

Спустя 7 минут, 2 секунды (24.06.2009 - 10:06) vriadchenko написал(а):
Цитата (twin @ 24.06.2009 - 06:59)
То есть в онлайн-режиме следить за процессом? А если их много, процессов? И как вообще... Что делать с данными, даже если их удасться получить?

Да. мне нужна мониторилка скачиваний онлайн. Если бы у меня была инфа по отданному кол-ву юзеру я бы периодически писал бы в скуль базу а в своей админке отслеживал состояние скачивания

Спустя 3 минуты, 3 секунды (24.06.2009 - 10:09) glock18 написал(а):
Цитата (vriadchenko @ 24.06.2009 - 07:06)
Да. мне нужна мониторилка скачиваний онлайн. Если бы у меня была инфа по отданному кол-ву юзеру я бы периодически писал бы в скуль базу а в своей админке отслеживал состояние скачивания


чего-то я смысл с трудом уловлю. Может тебе подойдет просто анализ логов веб-сервера? там есть достаточно много информации. единственное, по идее, что ты не сможешь там получить это какой именно пользователь сколько скачал - разве что по ip. суммарный трафик и всякая другая статистика оттуда вытаскивается легко.

Спустя 4 минуты, 52 секунды (24.06.2009 - 10:14) vriadchenko написал(а):
Цитата (glock18 @ 24.06.2009 - 07:09)
чего-то я смысл с трудом уловлю. Может тебе подойдет просто анализ логов веб-сервера? там есть достаточно много информации. единственное, по идее, что ты не сможешь там получить это какой именно пользователь сколько скачал - разве что по ip. суммарный трафик и всякая другая статистика оттуда вытаскивается легко.

у меня в урле указывается ИД клиента который скачивает и собственно что скачивает. Поэтому в базе у меня всего одна строка ИД клиента, Имя файла, процент скачанного. Можно было бы анализировать логи конечно только оттуда явно не вытащишь ни ИД ни файл

Спустя 2 минуты, 46 секунд (24.06.2009 - 10:17) glock18 написал(а):
Цитата (vriadchenko @ 24.06.2009 - 07:14)
у меня в урле указывается ИД клиента который скачивает и собственно что скачивает

Цитата (vriadchenko @ 24.06.2009 - 07:14)
Можно было бы анализировать логи конечно только оттуда явно не вытащишь ни ИД ни файл


вот это как раз неверно. если в урле все есть, то вытащить это как раз можно smile.gif

Спустя 2 минуты, 22 секунды (24.06.2009 - 10:19) sergeiss написал(а):
Теоретически - можно поставить на сервере какой-то программный шлюз, который будет контролировать процессы скачивания, и можно будет оттуда вытаскивать и анализировать информацию, связанную с IP пользователя.

Но я еще раз повторю вопрос: какое это имеет отношение к ПХП?

Вот когда у тебя такой шлюз будет, тогда уже можно будет говорить о связи с этим шлюзом через ПХП. Можно даже через АЯКС. Вообще красивую штучку можно будет сделать smile.gif

Спустя 51 минута, 26 секунд (24.06.2009 - 11:11) FatCat написал(а):
(f) passthru (string command [, int return_var])

При выводе в файл, функция выполняется в фоновом режиме, и тогда в самом пхп можно забирать return_var.
Это в теории. Но можно ли из этого сделать индикатор процесса скачивания файла - не представляю.

Спустя 3 часа, 49 минут, 22 секунды (24.06.2009 - 15:00) vriadchenko написал(а):
ладно, всем спасибо. тему закрываем. возможно я не правильно описал суть задачи, но решение такое. рабочее и полностью меня устраивающее

PHP
include_once('define.inc.php');

$server_file "/exchange/".$_GET['ID']."/".$_GET['taskName']. "/update.zip";
if (!
file_exists($server_file))
{
    print 
"file not exists";
    exit;
}

$local_file "update.zip";
$fp fopen($server_file'rb');

$bytesSent 0;
$fsize filesize($server_file);
header("Content-Type: application/octet-stream");
header("Content-Disposition: Attachment; filename=$local_file");
if (
$_GET['offset'] > 0)
{
    
fseek($fp$_GET['offset']);
    
$bytesSent $_GET['offset'];
}

//fpassthru($fp); //old behaviour

//send file by portions and store in DB progress

ignore_user_abort(true);
set_time_limit(0);

while(
1
{
    
$buf fread($fp1024*8);
    print 
$buf;
    
flush();
    
$bytesSent += strlen($buf);    
    
$msg "Downloaded ".$bytesSent." of ".$fsize;
    
$sql "insert into exchange_monitoring(id, task_name, dt, status) values
          ("
.$_GET['ID'].",'".$_GET['taskName']."', now(), '".$msg."')
      on duplicate key update dt = now(), status = '"
.$msg."'";
    
mysql_query($sql);
    if (
feof($fp))
    {
    
$st 1;
    break;
    }
    
    if (
connection_status()!=0)
    {
    
$st 2;
    break;
    }
}

if (
$st == 2)
{
    
$msg "Broken download at ".$bytesSent." of ".$fsize;
    
$sql "insert into exchange_monitoring(id, task_name, dt, status) values
          ("
.$_GET['ID'].",'".$_GET['taskName']."', now(), '".$msg."')
      on duplicate key update dt = now(), status = '"
.$msg."'";
    
mysql_query($sql);
}
else
{
    
$msg "Download finished";
    
$sql "insert into exchange_monitoring(id, task_name, dt, status) values
          ("
.$_GET['ID'].",'".$_GET['taskName']."', now(), '".$msg."')
      on duplicate key update dt = now(), status = '"
.$msg."'";
    
mysql_query($sql);
}


fclose($fp);
ignore_user_abort(false);
exit;
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.