file_get_contents関数でタイムアウトが効かない
カテゴリー: ぷろぐらみんぐ
2016-08-28
file_get_contents関数でタイムアウトが効かない
「効かない」でなくて、使う人が仕様を勘違いしているだけです。
webスクリプトから サイズのわからない または、得体のしれないサイトへ接続を要求するときは、
file_get_contentsは使ってはだめってことです。
(例)
$res = http_get($url, array('timeout'=>3);
「効かない」でなくて、使う人が仕様を勘違いしているだけです。
関数 | timeoutの概念 | 説明 | |
file_get_contents | パケットタイムアウト スレッド実行時間ではない |
パケット通信時間がタイムアウト時間を超えた場合に限り、処理を中断する。 接続が正常なら読み込み終わるまで処理を続ける。 |
標準関数 |
curl_exe | CURLOPT_TIMEOUT | cURL 関数の実行にかけられる時間の最大値。 関数のスレッドの実行時間 タイムアウト時間が経過しても終わっていない場合は、処理を中断する |
標準モジュール curl |
CURLOPT_CONNECTTIMEOUT | 接続の試行を待ち続ける秒数。0 は永遠に待ち続けることを意味します。 | ||
http_get | 関数のスレッドの実行時間 | タイムアウト時間が経過しても終わっていない場合は、処理を中断する | peclモジュール http 1.x |
webスクリプトから サイズのわからない または、得体のしれないサイトへ接続を要求するときは、
file_get_contentsは使ってはだめってことです。
if (!function_exists('http_get') && function_exists('curl_init')) { function http_get($url , $options = array()) { $crl = curl_init(); curl_setopt ($crl, CURLOPT_URL, $url); curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1); if (isset($options['timeout']) && intval($options['timeout']) > 0) { curl_setopt ($crl, CURLOPT_TIMEOUT, intval($options['timeout']));
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, intval($options['timeout']));
} $ret = curl_exec($crl); curl_close($crl); return $ret; } }
(例)
$res = http_get($url, array('timeout'=>3);