Как правильно открыть тайм-аут? - PullRequest
5 голосов
/ 24 марта 2010

У меня есть следующий фрагмент кода php

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

}
$info = stream_get_meta_data($fp);

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

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

1 Ответ

10 голосов
/ 25 марта 2010

Вы можете использовать stream_context_create () и параметр контекста http timeout. Но fopen() все равно вернет false, если произойдет тайм-аут, и 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);
}
...