Добрый вечер. Есть у меня список из ~120 доменов. Необходимо на одной странице в таблице в колонке "Статус" показать его доступность и код заголовка (200, 301, 404, 500 и т.д.). Проблема в том, что страница грузится овердолго (улетает в таймаут), делал вот так: Класc работы с CURL : PHP: <?php class curlClass{ public $info; public $header; private $url; public function __construct($url) { $this->url = $url; $this->setData(); } public function setData() { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->url); curl_setopt($curl, CURLOPT_NOBODY, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, true); $this->header = curl_exec($curl); $this->info = curl_getinfo($curl); curl_close($curl); } public function getResponseParam($param) { return $this->info[$param]; } } ?> Функция - хелпер : PHP: function check_domain_availible($domain){ $uri_info = new curlClass($domain); $status = $uri_info->getResponseParam('http_code'); switch ($status) { case '200': echo '<span class="label label-success" title="200 - found">Online</span> <small>'. $status .' code</small>'; break; case '301': echo '<span class="label label-success" title="301 - redirected">Online</span> <small>'. $status .' code</small>'; // и т.д. } } Ну во вью на странице в foreach на 120 элементов забиваю вызов функции : PHP: <?php foreach(getSites() as $site) {?> <td style="text-align: center;"> <?php check_domain_availible('http://'. $site['connection_url'])?> </td> <?}?> Не юзабельный вариант в моем исполнении получается, так как страница грузится до 180 сек и улетает в аут. Я с курлом первый раз работаю, это нормальная скорость работы или говнокод?
В самом cURL есть timeout и он скажем 60 секунд (зависит от твоих настроек). Теперь смотри, тебе попались 3 битые ссылки, каждую он пытается получить по 60 секунд, вот и 180 до timeout доходит. Запускай PHP через cli, там нет timeout, а в cURL стать timeout 5 секунд, тогда скрипт отработает примерно за 5 * 120 секунд. Что за доступность? Может Whois, ещё DNS чтобы отдавал запись A/AAAA или достаточно проверить ответ веб сервера?
Идея проста, есть небольшая админ панель, есть таблица доменов в которой есть n-ое количество столбцов с разной информацией и последний столбец "Status" нужен для проверки ответа веб сервера, самый просто вариант (http status 200 - сайт доступен, 404-500 - недоступен). В этом списке сейчас все сайты доступны (заголовки 200, 302 - found) и даже в таком случае время выполнения очень большое. И страница грузится очень долго. Может быть есть альтернативный вариант реализации данной задумки, в котором страница будет выводиться сразу, а результат в столбец подгружаться постепенно? Вы имели ввиду параметр CURLOPT_CONNECTTIMEOUT ? Такой вариант тоже не совсем подходит, время выполнения скрипта пропорционально времени загрузки страницы с таблицей и 5 * 120 сек очень много. Может быть можно запустить curl в несколько потоков?
Может быть параллельные ajax запросы помогут решить проблему? JQuery Deferred — примеры использования
Так и сделал, переписал класс с использованием multi_curl, время выполнения сократилось существенно - "Page Load Time : 2.16054 seconds", что в принципе приемлемо. Спасибо.