Я использую 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 = '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); }