2010-03-24 3 views
5

Привет всем, У меня есть следующий фрагмент кода PHPКак получить FOPEN таймаут правильно

if($fp = fopen($url, 'r')) { 
    stream_set_timeout($fp, 1); 
    stream_set_blocking($fp, 0); 

} 
$info = stream_get_meta_data($fp); 

Я хотел бы запрос тайм-аут после 1 секунды ... если я поставлю сон (20) в моем $ url, который я читаю, он просто ждет целых 20 секунд и никогда не уходит. Есть ли лучший способ сделать тайм-ауты с fopen?

Если я использую ini_set ('default_socket_timeout', 2); выше этого кода он иссякает должным образом, но $ info затем становится нулевым, поэтому я бы хотел использовать функции потока.

благодарит

+0

Что вы ожидаете от информации о том, когда будет время ожидания соединения? – VolkerK

ответ

10

Вы можете использовать stream_context_create() и http context option timeout
Но Еореп() по-прежнему будет возвращать ложь, если возникает тайм-аут и stream_get_meta_data() не будет работать.

$url = 'http://...'; 
$context = stream_context_create(array(
    'http'=>array(
    'timeout' => 2.0 
) 
)); 
$fp = fopen($url, 'r', false, $context); 
if (!$fp) { 
    echo '!fopen'; 
} 
else { 
    $info = stream_get_meta_data($fp); 
    var_dump($info); 
} 
+0

Единственная проблема с тем, что контекст не был добавлен до тех пор, пока php5 и код, который я пишу, к сожалению, должны быть совместимы с php4 :( – James

+1

В руководстве написано PHP 4.3.0, поэтому вам должно быть хорошо, http: //www.php.net/manual/en/function.stream-context-create.php –

+1

Я только что попробовал «тайм-аут», но когда я выбрал timeout = 2, на самом деле занять 4 секунды до таймаута, если timeout = 15 , на самом деле занимает 30 секунд до таймаута. Почему? – TomSawyer

Смежные вопросы