CURL – 获取HTTP代码

我使用CURL来获取网站的状态,如果它的上/下或redirect到另一个网站。 我想尽可能精简它,但效果不好。

<?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

有谁知道如何使performance更好?

首先确定url是否真正有效(一个string,不是空的,好的语法),这是快速检查服务器端。 例如,首先这样做可以节省很多时间:

 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 

有关获取url状态http代码的更多详细信息,请参阅我创build的另一个post(它也有助于跟随redirect):

  • 我如何检查一个URL是否通过PHP存在?

总的来说:

 $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); 

这里是我的解决scheme需要得到Status 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); }