За последние 24 часа нас посетили 18989 программистов и 1611 роботов. Сейчас ищут 767 программистов ...

проверка списка доменов на доступность

Тема в разделе "PHP для новичков", создана пользователем tesla, 27 окт 2016.

  1. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Добрый вечер.
    Есть у меня список из ~120 доменов. Необходимо на одной странице в таблице в колонке "Статус" показать его доступность и код заголовка (200, 301, 404, 500 и т.д.).
    Проблема в том, что страница грузится овердолго (улетает в таймаут), делал вот так:

    Класc работы с CURL :
    PHP:
    1. <?php
    2. class curlClass{
    3.    
    4.     public $info;
    5.     public $header;
    6.     private $url;
    7.    
    8.     public function __construct($url)
    9.     {
    10.         $this->url = $url;
    11.         $this->setData();
    12.     }
    13.    
    14.     public function setData()
    15.     {
    16.         $curl = curl_init();
    17.         curl_setopt($curl, CURLOPT_URL, $this->url);
    18.         curl_setopt($curl, CURLOPT_NOBODY, true);
    19.         curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    20.         curl_setopt($curl, CURLOPT_HEADER, true);
    21.         $this->header = curl_exec($curl);
    22.         $this->info = curl_getinfo($curl);
    23.         curl_close($curl);
    24.     }
    25.  
    26.     public function getResponseParam($param)
    27.     {
    28.         return $this->info[$param];
    29.     }
    30. }
    31. ?>
    Функция - хелпер :
    PHP:
    1. function check_domain_availible($domain){
    2.         $uri_info = new curlClass($domain);
    3.           $status = $uri_info->getResponseParam('http_code');
    4.         switch ($status) {
    5.             case '200':
    6.                     echo '<span class="label label-success" title="200 - found">Online</span> <small>'. $status .' code</small>';
    7.                 break;
    8.             case '301':
    9.                     echo '<span class="label label-success" title="301 - redirected">Online</span> <small>'. $status .' code</small>';
    10. // и т.д.
    11.         }
    12.    
    13.    }
    Ну во вью на странице в foreach на 120 элементов забиваю вызов функции :
    PHP:
    1. <?php foreach(getSites() as $site) {?>
    2. <td style="text-align: center;">
    3.  <?php  check_domain_availible('http://'. $site['connection_url'])?>
    4. </td>
    5. <?}?>
    Не юзабельный вариант в моем исполнении получается, так как страница грузится до 180 сек и улетает в аут. Я с курлом первый раз работаю, это нормальная скорость работы или говнокод?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    В самом cURL есть timeout и он скажем 60 секунд (зависит от твоих настроек).
    Теперь смотри, тебе попались 3 битые ссылки, каждую он пытается получить по 60 секунд, вот и 180 до timeout доходит.
    Запускай PHP через cli, там нет timeout, а в cURL стать timeout 5 секунд, тогда скрипт отработает примерно за 5 * 120 секунд.

    Что за доступность? Может Whois, ещё DNS чтобы отдавал запись A/AAAA или достаточно проверить ответ веб сервера?
     
  3. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Идея проста, есть небольшая админ панель, есть таблица доменов в которой есть n-ое количество столбцов с разной информацией и последний столбец "Status" нужен для проверки ответа веб сервера, самый просто вариант (http status 200 - сайт доступен, 404-500 - недоступен). В этом списке сейчас все сайты доступны (заголовки 200, 302 - found) и даже в таком случае время выполнения очень большое. И страница грузится очень долго. Может быть есть альтернативный вариант реализации данной задумки, в котором страница будет выводиться сразу, а результат в столбец подгружаться постепенно?

    Вы имели ввиду параметр CURLOPT_CONNECTTIMEOUT ? Такой вариант тоже не совсем подходит, время выполнения скрипта пропорционально времени загрузки страницы с таблицей и 5 * 120 сек очень много. Может быть можно запустить curl в несколько потоков?
     
  4. ELEMENTAL Limited

    ELEMENTAL Limited Новичок

    С нами с:
    14 окт 2016
    Сообщения:
    19
    Симпатии:
    6
    #4 ELEMENTAL Limited, 27 окт 2016
    Последнее редактирование: 27 окт 2016
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Надо замерять, что конкретно долго, может webserver долго отвечает
    Да, можно, multi exec
     
    tesla нравится это.
  6. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Так и сделал, переписал класс с использованием multi_curl, время выполнения сократилось существенно - "Page Load Time : 2.16054 seconds", что в принципе приемлемо. Спасибо.