Apache / PHP обслуживающий файл несколько раз - PullRequest
5 голосов
/ 05 февраля 2010

У меня есть система со страницей download.php.Страница берет и идентифицирует и загружает файл, основанный на записи БД, а затем подает его.Я заметил пару случаев, когда файлы запрашиваются несколько раз за короткий промежуток времени (20 мс).Времена, которые слишком быстры для человеческого восприятия.Есть много случаев, когда загрузчик работает нормально.Однако, при более внимательном рассмотрении использования загрузчика, я увидел интересное поведение.

Например, IP-адрес xxx.xxx.xxx.xxx (который находится в диапазоне, принадлежащем xxxxxx.deв германию) зашел на сайт через гугл.Они просмотрели и затем зашли на страницу http://site.com/xxxx/press+125.php Там они в 9:04:23 отправили запрос на /download.php?id=/ZZ/n+aH55Y= (PDF).Это само по себе не имеет большого значения.Тем не менее, интересно то, что сервер, похоже, был довольно занят обслуживанием этого запроса.В журналах запрос сначала завершается между 9:09:48 и 9:10:00.Похоже, что пользователь, должно быть, устал от ожидания в течение этого времени и запросил документ еще два раза.Между 09:14:47 и 09:15:00 снова появляется тот же запрос, за исключением того, что с 9:04:43, на 20 мс позже, чем первый запрос.Затем он появляется в третий раз с запросом, который начался в 09:05:06 и завершился между 09:19:55 и 09: 19: 58!

Я с подозрением отношусь к этому документу.Просматривая журналы, я вижу другие случаи, когда серверу требуется некоторое время, чтобы обработать этот конкретный файл.Проверьте этот список запросов от zzz.zzz.zzz.zzz [отличается от выше] для файла /download.php?id=/ZZ/n+aH55Y= (тот же документ, что и раньше):

Время запроса Полное время 04:32:43 04:33:36 04:32:50 04:33:36 04:32:51 04:33:38 04:33:05 04:33:38 04:33:34 04: 33: 42 04:33:05 04: 33: 42

Так что что-то определенно происходит.Связано ли это с тем, что этот конкретный документ запускает сервер, код страницы download.php, или мы просто видим свидетельство некоторой перегрузки на уровне сервера, когда она воспроизводится в режиме реального времени, я пока не уверен.

Справедливости ради есть и другие случаи, когда люди скачивают /download.php?id=/ZZ/n+aH55Y= (тот же PDF) без ошибок.Тем не менее, интересно, что несколько процессов происходят только с одним файлом и только тогда, когда к нему обращаются через страницу http://site.com/press+125.php.Дальнейшее расследование, если что-то не так внутри кода, заставляет систему запускать несколько запросов на загрузку, которые занимают сервер.

Я не знаю, является ли нажатие + 125.php кроличьей ношей, ноесть странная догадка.

Есть идеи?У меня совершенно нет идей.Апач исчерпан?Такие вещи.

///DOWNLOAD.php
$file = new files();
$file->comparison_filter("id", "=", $id); //sql to load
if ($file->load()) {
    $file->serve(); 
}


//FILES
function serve() {  
        if ($this->is_loaded) {
            if (file_exists($this->get_value("filename"))) {
                if ($this->get_value("content_type") != "") {
                    header("Content-Type: " . $this->get_value("content_type"));
                }       
                header("Content-Length: " . filesize($this->get_value("filename")));
                if ($this->get_value("flag_image") == 0 || $this->get_value("flag_image") == false) {
                    header("Cache-Control: private");
                    header("Content-Disposition: attachment; filename=" . urlencode($this->get_value("original_filename")));
                }

                set_time_limit(0);
                @readfile($this->get_value("filename"));

                exit;
            }
        }
}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2010
  1. Проанализировали ли вы User-Agent и Заголовки реферера в HTTP-запросе?
  2. Почему бы не обслуживать все статические файлы из апача или что у вас есть? Если вы хотите отслеживать скачать статистику вы можете перенаправить из вашего скрипта в статический файл
0 голосов
/ 06 февраля 2010

Добавьте «% D% X» к вашей конфигурации регистрации - я надеюсь, что это ответит на многие ваши вопросы.

C.

0 голосов
/ 05 февраля 2010

Использование сети CDN для загрузки файлов. Они справятся с этим для вас, а также предоставят вам пропускную способность и масштабируемость. Больше никаких блокировок на вашем сервере. http://www.reelseo.com/free-cdn-velocix/

...