PHP を使用して、特定のインスタンスで Web サイトが稼働しているか停止しているかを確認したいと考えています。curl がファイルの内容をフェッチすることを知りましたが、Web サイトの内容を読みたくありません。Webサイトの状態を確認したいだけです。サイトの状態を確認する方法はありますか? ping を使用してステータスを確認できますか? サーバーから (404、403 など) のようなステータス信号を取得するだけで十分です。コードの小さなスニペットが大いに役立つかもしれません。
7 に答える
このようなものはうまくいくはずです
$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
}
curl -Is $url | grep HTTP | cut -d ' ' -f2
curl -Is $url
ヘッダーのみを出力します。
grep HTTP
HTTP 応答ヘッダーにフィルターをかけます。
cut -d ' ' -f2
出力を 2 番目の「単語」、この場合はステータス コードにトリムします。
例:
$ curl -Is google.com | grep HTTP | cut -d ' ' -f2
301
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;
これが私がやった方法です。ターゲットが私を禁止する可能性を最小限に抑えるようにユーザー エージェントを設定し、ターゲットを知っているため、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);
}
ping
あなたが探していることはしません - マシンが起動している (そして に応答しているping
) かどうかだけを教えてくれます。ただし、これは必ずしも Web サーバーが稼働していることを意味するわけではありません。
http_headメソッドを使用してみてください。これは、Web サーバーが送り返すヘッダーを取得します。サーバーがヘッダーを送り返している場合は、サーバーが稼働中であることがわかります。
get_headers() 関数を見たことがありますか? http://it.php.net/manual/en/function.get-headers.php。それはまさにあなたが必要とすることをするようです。
-I フラグを指定して curl を直接使用すると、ページ HTML の代わりに HTTP ヘッダー (404 など) が返されます。PHP では、同等のものはcurl_setopt($ch, CURLOPT_NOBODY, 1);
オプションです。
ping
別のサービスであるため、 でWeb サーバーをテストすることはできません。サーバーは稼働している可能性がありますが、いずれにしても webserver-daemon がクラッシュする可能性があります。したがって、カールはあなたの友達です。内容を無視するだけです。