2013-05-11 2 views
1

Я пытаюсь протестировать ответ сервера с нескольких клиентских сайтов, используя cURL, чтобы получить только заголовок, завернутый в вызов microtime, чтобы вычислить полное время выполнения (для серверного roundtrip) и код состояния HTTP, чтобы я и клиент могли знать о любых проблемах.PHP cURL Запрос заголовка, возвращающий 400 на некоторых серверах

Мне нужно позвонить cURL по IP-адресу сервера с указанным там хостом, поскольку я хочу быть на 100% уверенным, чтобы исключить провал DNS-сервера. Я использую другой скрипт, чтобы убедиться, что мои копии DNS обновлены, так что Не ошибка.

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

// Setup headers 
    $header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
    $header[] = "Accept-Language: en-us,en;q=0.5"; 
    $header[] = "Cache-Control: max-age=0"; 
    $header[] = "Connection: keep-alive"; 
    $header[] = "Host: $this->url"; 
    $header[] = "Keep-Alive: 300"; 
    $header[] = "Pragma: "; // browsers keep this blank. 

    $starttime = microtime(true); 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, "http://{$this->ip}/"); 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
    curl_setopt($curl, CURLOPT_USERAGENT,"MyMonitor/UpCheck"); 
    // curl_setopt($curl, CURLOPT_REFERER, 'http://www.mysite.com/'); 
    curl_setopt($curl, CURLOPT_HTTPGET, true); 
    curl_setopt($curl, CURLOPT_NOBODY, true); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout); //timeout in seconds 
    $this->header = curl_exec($curl); 
    $this->statuscode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
    curl_close($curl); 

Код завернут в объект и все соответствующие переменные правильно переданы, обрезаны и дезинфицированы. Поскольку мне нужно вызвать IP-адрес сервера, он передается как CURLOPT_URL с URL-адресом, переданным в заголовке. Я попытался установить рефери, но это не помогло.

Спасибо,

+0

Доступны ли они в браузере _ использование ip вместо адреса_? –

+0

Не напрямую, нет - все сайты размещены на общем хостинге или VPS-хостинге, поэтому ему нужен адрес для определения сайта на сервере. Я подозреваю, что это может быть результатом конфигурации сервера клиента, но надеюсь, что есть способ обойти это. –

ответ

1

Если все, что вам нужно, это первая строка из заголовка, то с помощью завиток является излишеством. Используя функции сокетов, вы можете закрыть соединение сразу после получения первой строки со кодом состояния:

$conn = fsockopen($this->ip, 80); 
$nl = "\r\n"; 
fwrite($conn, 'GET/HTTP/1.1'.$nl); 
foreach($header as $h) { 
    fwrite($conn, $h.$nl); 
} 
fwrite($conn, $nl); 

$statusLine = fgets($conn); 
fclose($conn); 

$status = substr($statusLine, 9, 3); 
+0

А, это очень быстро, спасибо! Я еще не могу проголосовать, но я обязательно отвечу на этот ответ, когда у меня появятся еще несколько очков. Это должно сэкономить немало накладных расходов, очень ценится! –

Смежные вопросы