しかし、次の場合うまくいかないことが判明。
死活監視対象側での処理
http://webserver/check.php
<?php sleep(10);
死活監視する側の処理
<?php
// 例1
ini_set
(
'default_socket_timeout'
, 2);
$res = file_get_contents(‘http://webserver/check.php’);
// 例2
file_get_contents(“http://example.com/”, FALSE,
stream_context_create(array(
‘http’ => array(
‘timeout’ => 2,
‘ignore_errors’ => TRUE
)
))
);
試すと分りますが、例1,例2どちらで動かしても2秒で処理が終わりません。きっちり10秒かかり、しかも200が返ってきます。
理由は詳しく調べていないのでわかりませんが、多分タイムアウトの種類が違うのでしょうね(接続時のタイムアウトとか?)。
いずれにしろ使えないので、curlで対応しました。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, “http://example.com/”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER , TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
$response = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
これできっちり2秒で処理が戻ります。
処理結果については、curl_getinfo()関数の戻り値とcurl_exec($ch)の戻り値が使えます。
curl_exec($ch)が FALSE であればタイムアウト
$response[‘http_code’] に400以上の数字があれば、 not found だったり internal server errorだったりなど判断できます。