Если долго выполняется скрипт, как "красиво" оборвать?

flower

Новичок
Если долго выполняется скрипт, как "красиво" оборвать?

Скрипт читает через сокет данные с удалённого сервера. По непонятной причине иногда это занимает порядка 5 минут.. За это хостер уже второй раз блокирует сайт :(
Можно ограничить время выполнения скрипта через set_time_limit, но при этом на экран вылезет fatal error, не хочется пугать пользователей. Можно как-нибудь перехватить сообщение об ошибке при превышении лиита времени?
Или ограничить время обращения к удалённому серверу через сокеты.. Как это реализовать?
 

neko

tеam neko
kruglov
это не особо хороший способ, т.к. лаг может запросто быть до того, как этот stream создан.

скорее всего как раз именно ДО, он и происходит.
 

fixxxer

К.О.
Партнер клуба
это не особо хороший способ, т.к. лаг может запросто быть до того, как этот stream создан.
это хороший способ. при открытии сокета можно указать таймаут, либо же использовать асинхронную модель.

WP - мимо.

кстати, насчет того, что phpшный time_limit здесь сработает, есть очень большие сомнения.
 

flower

Новичок
Автор оригинала: fixxxer
это хороший способ. при открытии сокета можно указать таймаут, либо же использовать асинхронную модель.
Можно пример?
Вот кусок, читающий данные:

PHP:
$fp=@fsockopen($host,$port,$errno,$errstr);
if (!$fp) die ("Error: $errno ($errstr).");
fputs($fp,$data);

while(!feof($fp)){$fgets=fgets($fp,2048); if ($fgets=="\r\n" || $fgets=="\n"){break;} $head.=$fgets;}
while(!feof($fp)){$content.=fread($fp,2048);}
fclose($fp);
WP - мимо.
кстати, насчет того, что phpшный time_limit здесь сработает, есть очень большие сомнения.
Тоже сомневаюсь, ведь иначе он сработал бы. По умолчанию макс.время выполнения - 30 секунд. А тут 5 минут думает..
Но даже если и сработал бы - ловить fatal error.. только через output buffering..
 

fixxxer

К.О.
Партнер клуба
[m]fsockopen[/m]

-~{}~ 11.06.06 21:12:

и, кстати, попробуй выполнить gethostbyname($host)
будет тормозить - пинай хостера.
 

flower

Новичок
Да, fatal error можно перехватить только так :) По-крайней мере, другого способа не знаю.

Автор оригинала: fixxxer
[m]fsockopen[/m]
-~{}~ 11.06.06 21:12:
и, кстати, попробуй выполнить gethostbyname($host)
будет тормозить - пинай хостера.
Да вся проблема в том, что у хостера канал с инетом плохой, как я понимаю. Скрипт практически виснет, читая урл, который через браузер грузится моментально. Но ничего уже не поделать, хостер запретил нам использование скрипта. Иначе - полная блокировка аккаунта без возможности разблокирования :( Так что ищем другого хостера. Но вопрос остаётся открытым - нужна конкретная реализация таймаута при чтении данных через сокет. Выручайте..
 
Сверху