2013-05-11 74 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

相关问题