Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Счётчик скачиваний

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Реф
Отправлено: 05 Июля, 2010 - 08:34:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




Имеется код, организующий скачивание файлов с сайта и их подсчёт:
PHP:
скопировать код в буфер обмена
  1.  
  2. require_once("db_login.php");
  3.  
  4. function fileDownload($file, $id)
  5. {
  6.         if (file_exists($file))
  7.         {
  8.                 header($_SERVER["SERVER_PROTOCOL"].' 200 OK');
  9.                 header('Content-Type: application/octet-stream');    
  10.                 header('Last-Modified: '.gmdate('r', filemtime($file)));
  11.                 header('ETag: '.sprintf('%x-%x-%x', fileinode($file), filesize($file), filemtime($file)));
  12.                 header('Accept-Ranges: bytes');
  13.                 header('Content-Length: '.(filesize($file)));
  14.                 header('Connection: close');
  15.                 header('Content-Disposition: attachment; filename="'.basename($file).'";');
  16.                        
  17.                 $f = fopen($file, 'r');
  18.                 while(!feof($f) && !connection_status() )
  19.                 {
  20.                   echo fread($f, 1024);
  21.                   flush();
  22.                 }
  23.                 // Увеличение счётчика скачиваний файла
  24.                 global $connection;
  25.                 $query = "UPDATE files SET downloads = downloads+1 WHERE id_file = ?";
  26.                 $result = $connection->query($query, array($id));
  27.                 if (DB::isError($result) && $result)
  28.                 die("Ошибка запроса:<br />$query<br />".DB::errorMessage($result));
  29.                                
  30.                 fclose($f);
  31.         }
  32.         else
  33.         {
  34.                 header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
  35.                 header('Status: 404 Not Found');
  36.         }
  37.         exit;
  38. }
  39.        
  40. if (isset($_GET['id']) && $_GET['id'] && isset($_GET['file']) && $_GET['file'] && file_exists($_GET['file']))
  41. {
  42.         fileDownload($_GET['file'], $_GET['id']);
  43. }
  44. else
  45. {
  46.         header($_SERVER["SERVER_PROTOCOL"].' 404 Not Found');
  47.         header('Status: 404 Not Found');
  48. }
  49.  


Накрутка счётчика происходит даже если скачивания как такового и не было. Возможно ли это исправить, если да - то как? Буду благодарен за любую помощь.

(Отредактировано автором: 05 Июля, 2010 - 08:54:36)



-----
Думать надо головой, а не головкой!
 
 Top
Uchkuma
Отправлено: 05 Июля, 2010 - 08:59:54
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Наверно так:
PHP:
скопировать код в буфер обмена
  1. $f = fopen($file, 'r');
  2. while(!feof($f) && !connection_status() )
  3. {
  4. echo fread($f, 1024);
  5. }
  6.  
  7. if(feof($f) AND !connection_status()){
  8. // Сюда увеличение счётчика скачиваний файла
  9. }

(Отредактировано автором: 05 Июля, 2010 - 11:26:47)

 
 Top
Реф
Отправлено: 05 Июля, 2010 - 09:59:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




Uchkuma
Нет-с Огорчение


-----
Думать надо головой, а не головкой!
 
 Top
Uchkuma
Отправлено: 05 Июля, 2010 - 11:27:13
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




В условии !connection_status(), прошу прощения.
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 14:15:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Реф пишет:
Накрутка счётчика происходит даже если скачивания как такового и не было. Возможно ли это исправить, если да - то как? Буду благодарен за любую помощь
В случае передачи файлы со стороны web-сервера к клиенту невозможно полностью определить был ли скачан файл или нет - возможно только проследить число отправленных байт по каналу связи при открытом HTTP-соединении При этом например в зависимости от особенностей сети и маршрутизаторов в ней а также системных socket-ов приведенная схема не гарантирует отправки - поскольку последующий оператор echo выполняется сразу после предыдущего а не после подтверждения доставки до клиента предыдущих данных - то есть если имеется определенное суммарное время отправки всех данных клиенту который были выведены серией операторов echo и время выполнеии серии этих операторов различаются - и оператор echo и даже flush не приостанавливают работу PHP-скрипта на время соответствующей отправки данных
Таким образом для точного решения вопроса необходимо знать особенности работы sockets-ов в Apache - и перед генерацией новых данных для отправки их клиенту ждать информацию о получении предыдущих данных - обычный CGI-интерфейс не поддерживает такую возможность Тем не менее если для решения допустима определенная погрешность в тот блок информации который был засчитан PHP-скриптом как переданный но на самом деле только направился в очередь отправки - то можно использовать обычный вариант с отключением буферазации Также можно попробовать использовать замену для функции flush как комбинацию ob_start и ob_end_flush - с точки зрения работы относительно CGI-интерфейса разницы не имеется но PHP-интерпретатор может работать с ними по-разному


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB