2013-05-11 70 views
1

我試圖從幾個客戶端網站使用cURL檢索服務器響應來檢索僅包含在microtime調用中的頭部以計算完整執行時間(用於服務器往返),以及HTTP狀態代碼,以便我和客戶可以瞭解任何問題。PHP cURL在一些服務器上返回400的頭部請求

我需要通過服務器IP調用cURL並在那裏定義主機,因爲我希望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傳遞到Header中。我試過設置引用者,但這沒有幫助。

感謝,

+0

它們是否可以在瀏覽器中使用_使用ip而不是address_? – 2013-05-11 13:15:44

+0

不直接,不 - 這些網站都在共享主機或VPS主機上,所以它需要地址來識別服務器中的網站。我懷疑這可能是客戶端服務器配置的結果,但希望有一種解決方法。 – 2013-05-11 15:09:12

回答

1

如果你需要的是從頭部的第一行,然後使用curl是矯枉過正。使用套接字功能,您可以在收到狀態碼第一行後立即關閉連接:

$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

啊,非常快,謝謝!我還不能投票,但是當我有更多的觀點時,我一定會對這個答案進行+1。這應該會節省相當多的開銷,非常感謝! – 2013-05-12 09:50:06

相關問題