我想使用 PHP 检查网站在特定实例中是启动还是关闭。我知道 curl 会获取文件的内容,但我不想阅读网站的内容。我只是想检查网站的状态。有什么方法可以检查网站的状态吗?我们可以使用 ping 来检查状态吗?我从服务器获取状态信号(404、403 等)就足够了。一小段代码可能对我有很大帮助。
问问题
76988 次
7 回答
50
像这样的东西应该工作
$url = 'yoururl';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (200==$retcode) {
// All's well
} else {
// not so much
}
于 2011-01-05T18:28:26.947 回答
11
curl -Is $url | grep HTTP | cut -d ' ' -f2
curl -Is $url
只输出标题。
grep HTTP
过滤到 HTTP 响应标头。
cut -d ' ' -f2
将输出修剪为第二个“字”,在本例中为状态码。
例子:
$ curl -Is google.com | grep HTTP | cut -d ' ' -f2
301
于 2012-08-28T05:31:04.063 回答
10
function checkStatus($url) {
$agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; pt-pt) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27";
// initializes curl session
$ch = curl_init();
// sets the URL to fetch
curl_setopt($ch, CURLOPT_URL, $url);
// sets the content of the User-Agent header
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
// make sure you only check the header - taken from the answer above
curl_setopt($ch, CURLOPT_NOBODY, true);
// follow "Location: " redirects
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// disable output verbose information
curl_setopt($ch, CURLOPT_VERBOSE, false);
// max number of seconds to allow cURL function to execute
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
// execute
curl_exec($ch);
// get HTTP response code
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpcode >= 200 && $httpcode < 300)
return true;
else
return false;
}
// how to use
//===================
if ($this->checkStatus("http://www.dineshrabara.in"))
echo "Website is up";
else
echo "Website is down";
exit;
于 2012-05-31T06:03:33.190 回答
5
你见过 get_headers() 函数吗?http://it.php.net/manual/en/function.get-headers.php。它似乎完全符合您的需要。
如果直接使用带有 -I 标志的 curl,它将返回 HTTP 标头(404 等)而不是页面 HTML。在 PHP 中,等效项是curl_setopt($ch, CURLOPT_NOBODY, 1);
选项。
于 2011-01-05T18:23:37.807 回答
5
ping
不会做你正在寻找的 - 它只会告诉你机器是否启动(并响应ping
)。不过,这并不一定意味着网络服务器已启动。
您可能想尝试使用http_head方法 - 它会检索网络服务器发回给您的标头。如果服务器正在发回标头,那么您就知道它已启动并正在运行。
于 2011-01-05T18:24:59.140 回答
5
这是我的做法。我设置了用户代理,以尽量减少目标禁止我的机会,并禁用 SSL 验证,因为我知道目标:
private static function checkSite( $url ) {
$useragent = $_SERVER['HTTP_USER_AGENT'];
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // do not return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_USERAGENT => $useragent, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 2, // timeout on connect (in seconds)
CURLOPT_TIMEOUT => 2, // timeout on response (in seconds)
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // SSL verification not required
CURLOPT_SSL_VERIFYHOST => false, // SSL verification not required
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
curl_exec( $ch );
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpcode == 200);
}
于 2014-06-27T07:59:22.100 回答
2
您不能使用 测试网络服务器ping
,因为它是不同的服务。服务器可能正在运行,但 webserver-daemon 无论如何都可能崩溃。所以 curl 是你的朋友。直接忽略内容。
于 2011-01-05T18:25:30.147 回答