CURL – Получение кода HTTP

Я использую CURL, чтобы получить статус сайта, если он вверх / вниз или перенаправляется на другой сайт. Я хочу сделать его максимально упрощенным, но он не работает.

<?php $ch = curl_init($url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_TIMEOUT,10); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $httpcode; ?> 

У меня это завернуто в функцию. Он работает нормально, но производительность не самая лучшая, потому что она загружает всю страницу, в том случае, если я $output = curl_exec($ch); он возвращает 0 все время.

Кто-нибудь знает, как улучшить производительность?

сначала убедитесь, что URL-адрес действителен (строка, а не пустой, хороший синтаксис), это быстро проверить сервер. например, это может сэкономить много времени:

 if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){ return false; } 

убедитесь, что вы получаете только заголовки, а не содержимое тела:

 @curl_setopt($ch, CURLOPT_HEADER , true); // we want headers @curl_setopt($ch, CURLOPT_NOBODY , true); // we don't need body 

для получения дополнительной информации о получении http-кода статуса URL-адреса я ссылаюсь на другое сообщение, которое я сделал (он также помогает при следующих перенаправлениях):

  • Как проверить, существует ли URL через PHP?

В целом:

 $url = 'http://www.example.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, true); // we want headers curl_setopt($ch, CURLOPT_NOBODY, true); // we don't need body curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT,10); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo 'HTTP code: ' . $httpcode; 
 // must set $url first.... $http = curl_init($url); // do your curl thing here $result = curl_exec($http); $http_status = curl_getinfo($http, CURLINFO_HTTP_CODE); curl_close($http); echo $http_status; 

Попробуйте функцию PHP get_headers .

Что-то вроде:

 <?php $url = 'http://www.example.com'; print_r(get_headers($url)); print_r(get_headers($url, 1)); ?> 
 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 20); $rt = curl_exec($ch); $info = curl_getinfo($ch); echo $info["http_code"]; 

curl_exec необходим. Попробуйте CURLOPT_NOBODY чтобы не загружать тело. Это может быть быстрее.

curl_getinfo – получить информацию о конкретной передаче

Проверить curl_getinfo

 <?php // Create a curl handle $ch = curl_init('http://www.yahoo.com/'); // Execute curl_exec($ch); // Check if any error occurred if(!curl_errno($ch)) { $info = curl_getinfo($ch); echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url']; } // Close handle curl_close($ch); 

Вот мое решение, нужно получить статус Http для регулярного проверки состояния сервера

 $url = 'http://www.example.com'; // Your server link while(true) { $strHeader = get_headers($url)[0]; $statusCode = substr($strHeader, 9, 3 ); if($statusCode != 200 ) { echo 'Server down.'; // Send email } else { echo 'oK'; } sleep(30); }