file_get_contents関数でタイムアウトが効かない

file_get_contents関数でタイムアウトが効かないWeb開発者の備忘録Webサーバの死活監視を組み込みたいため、ある一定時間応答が無いかどうかチェックしようとしました。
しかし、次の場合うまくいかないことが判明。

死活監視対象側での処理
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だったりなど判断できます。