Всё просто:
$context = stream_context_create([
'http' => [
'timeout' => (float) 20
]
]);
$result = file_get_contents('http://адрес.ru', false, $context);
Как поймать запрос, который отваливается по таймауту? Код ответа у нужных подвисающих страниц почему-то всегда 200. Исключений file_get_contents не кидает, только warning'и (error_reporting(E_ALL) не поможет в этом случае)