Я по-прежнему довольно новичок в php, можете ли вы прокомментировать, является ли код, приведенный ниже, хорошим, чтобы сказать, вверх или вниз сайт, и если это может быть неприемлемо причины, почему и лучшие альтерналисты?
Заранее спасибо.
$siteHeader = @get_headers($url , 1); if ($siteHeader > 1) { $siteUp = true; } else { $siteUp = false; }
Я использую завиток, но это только я:
function check($url,$ignore = ''){ $agent = "Mozilla/4.0 (B*U*S)"; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_USERAGENT,$agent); curl_setopt($ch,CURLOPT_VERBOSE,false); curl_setopt($ch,CURLOPT_TIMEOUT,45); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,45); curl_setopt($ch,CURLOPT_HEADER,true); curl_setopt($ch,CURLOPT_NOBODY,true); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true); curl_setopt($ch,CURLOPT_MAXREDIRS,5); //follow up to 10 redirections - avoids loops curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); //fix for certificate issue curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); //fix for certificate issue $page = curl_exec($ch); $err = curl_error($ch); $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); $codes = array( 0=>'Domain Not Found',100=>'Continue',101=>'Switching Protocols',200=>'OK',201=>'Created',202=>'Accepted',203=>'Non-Authoritative Information',204=>'No Content',205=>'Reset Content',206=>'Partial Content',300=>'Multiple Choices',301=>'Moved Permanently',302=>'Found',303=>'See Other',304=>'Not Modified',305=>'Use Proxy',307=>'Temporary Redirect',400=>'Bad Request',401=>'Unauthorized',402=>'Payment Required',403=>'Forbidden',404=>'Not Found',405=>'Method Not Allowed',406=>'Not Acceptable',407=>'Proxy Authentication Required',408=>'Request Timeout',409=>'Conflict',410=>'Gone',411=>'Length Required',412=>'Precondition Failed',413=>'Request Entity Too Large',414=>'Request-URI Too Long',415=>'Unsupported Media Type',416=>'Requested Range Not Satisfiable',417=>'Expectation Failed',500=>'Internal Server Error',501=>'Not Implemented',502=>'Bad Gateway',503=>'Service Unavailable',504=>'Gateway Timeout',505=>'HTTP Version Not Supported'); $httpcode_out = 'http: '.$httpcode.' ('.$codes[$httpcode].')'; $err = 'curl error: '.$err; $out = array( $url,$httpcode_out,$err); if($httpcode>=200&&$httpcode<307){//good return array('Work',$out); }else{//BAD return array('Fail',$out); }
}
В зависимости от вашего дела, но, особенно если ваш URL-адрес отправлен пользователем, я бы пошел на что-то подобное.
//returns true, if domain is availible, false if not function isDomainAvailible($domain) { //check if URL is valid if(!filter_var($domain, FILTER_VALIDATE_URL)){ return false; } $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $agent); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch,CURLOPT_VERBOSE, FALSE); curl_setopt ($ch, CURLOPT_TIMEOUT, 10); curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ch,CURLOPT_SSLVERSION, 3); curl_setopt ($ch,CURLOPT_SSL_VERIFYHOST, FALSE); $page=curl_exec($ch); //echo curl_error($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpcode >= 200 && $httpcode < 300) return true; else return false; }
В основном потому, что некоторые серверы не будут отвечать, если вы не отправляете пользовательский аккаунт.
Обновление: чем больше я думаю об этом, тем менее он выглядит. Я расширил свой первоначальный ответ, который в ретроспективе был наивным.
Это нормально для базового использования, но вы можете также проверить код ответа HTTP, а не просто проверить, есть ли у вас ответ. То, как код прямо сейчас, он просто говорит вам, что кто-то слушал на другой стороне, что далеко от того, что большинство людей считают «сайт вверх».
Вот как легко изолировать код ответа HTTP (или получить false
если запрос не удался):
$headers = get_headers('http://www.google.com'); $code = $headers ? intval(end(explode(' ', $headers[0], 2))) : false;
Кроме того, есть также вопрос о перенаправлении: что вы будете делать, если увидите перенаправление? Сервер, который вы запросили, может быть в порядке, но сервер, на который вы перенаправлены, может быть отключен. Если кто-то набрал URL-адрес в браузере, он будет перенаправлен и, в конечном счете, тайм-аут, в то время как одноэтапный тест сказал бы, что все в порядке. Что делать, если есть цикл перенаправления? Браузер обнаружил бы это и, в конечном итоге, тайм-аут, но вам нужно написать довольно много кода, чтобы сделать то же самое.
Таким образом, cURL действительно выглядит как единственное верное решение, потому что оно делает все это прозрачно.