Добавление кода замедляет страницу вниз - PullRequest
0 голосов
/ 11 сентября 2009

Мой клиент заказал еще одно дополнение к сценарию, но я не могу понять, как исправить замедление? В таблице около 50 000 строк.

 while($stats = mysql_fetch_array($get_stats)) {
  if ($stats['ip'] == gethostbyaddr($stats['ip'])) { // new code
   $is_undef = "Yes";            // causing problems
  } else { $is_undef = "No"; }      // end new code

 echo "<tr><td>" . date("d M Y g:i a ", strtotime($stats['date'])) . "</td><td>" .
       $stats['ip'] . "</td><td>" .
          parse_url_domain($stats['ref_url']) . "</td><td>" .
             $is_undef . "</td></tr>";
 }

Это запрос:

 $get_stats = mysql_query("SELECT * FROM visitors WHERE site='$_GET[site]' AND date >= '$start_date' AND date <= '$end_date' ");

Ответы [ 6 ]

4 голосов
/ 11 сентября 2009

Я думаю, что у вас может быть проблема с "gethostbyaddr". Цикл этих 50 тысяч раз будет ДЕЙСТВИТЕЛЬНО медленным.

Кроме того, это не относится к вопросу, но вы можете немного подумать о внедрении sql. Я надеюсь, что это не тот запрос, который вы выполняете. Если это так, кто-то может просто уронить ваш стол.

1 голос
/ 12 сентября 2009

Я бы предложил сделать эту проверку до того, как вы добавите каждый адрес в таблицу базы данных (т.е. один раз вместо 50 000 раз каждый раз, когда данные просматриваются!

0 голосов
/ 11 сентября 2009

Я думаю, что вызов gethostbyaddr () замедляет вас.

См. http://us3.php.net/manual/en/function.gethostbyaddr.php#88920

0 голосов
/ 11 сентября 2009

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

также, большинство интернет-провайдеров используют блоки IP-адресов, так что вы можете начать создавать таблицы, которые отслеживают диапазоны IP-адресов и маски хостов для интернет-провайдеров, чтобы исключить DNS-запросы

0 голосов
/ 11 сентября 2009

из комментариев на http://php.net/gethostbyaddr:

"Просто хотел, чтобы все знали, что gethostbyaddr () требует более 20 секунд для ответа, если IP-адрес не указан в DNS."

Я бы сказал, что поиск этих имен хостов в цикле, вероятно, замедляет вас.

также необходимо правильно экранировать переменные, которые вы отправляете в этом запросе, или вы действительно напрашиваетесь на неприятности.

0 голосов
/ 11 сентября 2009

Полагаю, gethostbyaddr() работает медленно, поскольку не может найти хост по IP-адресу. Какова же цель следующего выражения?

$stats['ip'] == gethostbyaddr($stats['ip'])

Предположим, $stats['ip'] равно 127.0.0.1, а соответствующий хост localhost. Таким образом, вы бы сравнили 127.0.0.1 (IP-адрес) с localhost (имя хоста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...