Как я могу ограничить количество времени, в течение которого PHP будет ожидать результата?

Я включаю локальный класс, который запрашивает файл с удаленного сервера. Этот процесс довольно ненадежен — потому что удаленный сервер часто перегружен — и мне иногда приходится ждать около 20 секунд, прежде чем включение прекращается и продолжается.

хотелось бы иметь ограничение на время выполнения включаемого скрипта; скажем, пять секунд.

Текущий код:

include('siteclass.class.php');

Обновление:

Мой код внутри класса:

$movie = str_replace(" ","+",$movie);
$string = join('',file($siteurl.$l.'/moviename-'.$movie));

if(!$i) { static $i = 1;}
if($file_array = $string)
{
    $result = Return_Substrings($file_array, '<item>', '</item>');

    foreach($result as $res) {

Вот, в принципе, и все, что касается загрузки. Внутренняя обработка занимает около 0,1 с. Думаю, это вполне выполнимо.


person Maurice Kroon    schedule 04.06.2009    source источник
comment
Странно, если у вас есть скрипт, который иногда может обойтись без внешнего класса. Я имею в виду либо использовать его всегда, либо никогда. 20 секунд слишком медленно. Я думаю, вам следует переосмыслить свое программное обеспечение.   -  person Alec Smart    schedule 04.06.2009
comment
Какой код на самом деле выполняет запрос? Например, если вы используете cURL, вы можете установить тайм-аут и обработать ошибку.   -  person Kekoa    schedule 04.06.2009


Ответы (4)


Обратите внимание, что я не тестировал этот код, примите это как предложение:

$fp = fopen('siteclass.class.php', 'r');

stream_set_timeout($fp, 2);
stream_set_timeout($fp,$timeout);
$info = stream_get_meta_data($fp);

if ($info['timed_out']) {
  echo "Connection Timed Out!";
} else {
  $file = '';
  while (!feof($fp)) {
    $file .= fgets($fp);
  }
  eval($file);
}

Тайм-аут задается в секундах, поэтому в примере установлено значение две секунды.

person Sylvain    schedule 04.06.2009
comment
Спасибо за помощь. получается, что мой файл php возвращает пустой. Никаких ошибок ничего, просто пусто. Я предполагаю, что это связано с тем, что я не включаю класс внутри страницы. (хотя не уверен, не эксперт), но мне не хватает некоторых переменных, запрошенных в классе. (установлены некоторые глобальные переменные, такие как '$movie'. Что вы думаете? Спасибо в любом случае! - person Maurice Kroon; 04.06.2009
comment
хорошо, прошу прощения за свою некомпетентность.. Но оказалось, что я забыл удалить '‹?php' из файлов классов. во всяком случае, это работает сейчас! спасибо!! - person Maurice Kroon; 05.06.2009

Это не точно соответствует тому, что вы ищете, но это установит ограничение времени для включения и выполнения в общей сложности на 25 секунд. Если лимит времени достигнут, он выдает фатальную ошибку.

set_time_limit(25);
person James Skidmore    schedule 04.06.2009

Похоже, set_time_limit() может делать то, что вы хотите:

Руководство по PHP для этой функции

person brettkelly    schedule 04.06.2009

Исправьте включенный код, чтобы он имел тайм-аут в HTTP-запросе, а затем хорошо восстановился, вместо того, чтобы просто прервать, установив ограничение по времени для самого скрипта.

Мой совет — искать корень проблемы, а не искать обходной путь.

person Kekoa    schedule 04.06.2009
comment
что вы рекомендуете с моим (недавно обновленным) кодом? я согласен с вашим видением › исправьте это в корне. спасибо - person Maurice Kroon; 04.06.2009