Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Браузер не выводит весь ответ скрипта


Автор: d0k 16.2.2010, 01:44
Скрипт обрабатывает запрос и выводит ответ. Замечу сразу, что скрипт использует LWP и выводит ответ (строки) поочередно с некоторой паузой после проверки.

В браузерах почему-то соединение со скриптом разрывается после некоего таймаута и выводится только  2-3 первых результата.

В чем причина? smile 

Как (с помощью каких заголовков) заставить браузеры ждать ответ скрипта полностью.


Автор: klem4 16.2.2010, 22:18
Думаю Вам нужно покопаться в настройках Apache или тоге сервера который Вы используете. В Apache посмотрите директиву TimeOut

Код

TimeOut Directive
Description:    Amount of time the server will wait for certain events before failing a request
Syntax:    TimeOut seconds
Default:    TimeOut 300
Context:    server config, virtual host
Status:    Core
Module:    core

Автор: Nab 16.2.2010, 23:08
Ну во первых, сам протокол HTTP на такое не расчитан. Хотя и есть Keep-Alive но и он имеет таймаут. 

А в действительности здесь 2 параметра влияют: 
Первый, таймаут сервера. Это когда сам апач к примеру ждет выполнения долгоиграющего скрипта по моему секунд 30. Потом тупо убивает процесс.
Второе таймаут браузера, С этим сложнее, тут вообще никак повлиять нельзя.


Решения:

Переписать скрипты пооптимальнее, чтобы время отклика было в разумных пределах.

Узнать что первым отваливается сервер или клиент. Если сервер то поднять время таймаута. Сами ищите в настройках как называется.

Если отваливается клиент, то когда-то давно я надыбал чье-то оригинальное решение. Пока скрипт не сформировал полностью контент он должен хоть чтото сделать, чтобы удержать клиента. И для этого подойдет периодическая, раз в секунду или даже реже, отправка скриптом символа с кодом \0. Ну то есть нультерминированной пустой строки. Это не даст повода браузеру закрыть соединение да и сервер будет какую-то активность поддерживать. При этом в вывод ничего не попадет. Конечно если браузер ожидает получить текстовый контент.

Ну или применить туже технологию которая применяется для показа upload прогресс бара, при отправке файлов на сервер, Js+ AJAX.

Автор: d0k 17.2.2010, 16:49
Сама конфигурация апача мне недоступна - сайт на виртуальном хостинге.
Спасибо за советы, попробую с постоянным выводом от скрипта нулевого символа для удержания клиента.

Но есть одина особенность в этом во всем - ниже скрипт:

Код

#!/usr/bin/perl -w
$|=1;

use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Time::localtime; 

my ($thour,$tmin,$tsec,$tday,$tmon,$tyear);

print "Content-Type: text/html\n";
print "Connection: Keep-Alive\n";
print "Pragma: no-cache\n\n";


my $r=20;
header(); #----- выводит шапку html
while ( $r>0 ){
tm();
print "-=$r=- $tyear-$tmon-$tday   $thour:$tmin:$tsec <br>";
open ( FILE,">>out-tmp.txt");
print FILE "-=$r=-\n";
print FILE " $tyear-$tmon-$tday   $thour:$tmin:$tsec\n";
close (FILE);
sleep 15;
$r--;
}

footer();  #-----выводит закрывающие тэги </body> </html>


exit;


sub tm{
$thour=localtime->hour();
$tmin=localtime->min();
$tsec=localtime->sec();
$tday=localtime->mday();
$tmon=localtime->mon()+1;
$tyear=localtime->year()+1900;
}


sub header{
print <<'htmtags'
<html>
<head>
<title>test</title>
<meta http-equiv="PRAGMA" content="no-cache"> 
<meta http-equiv="Cache-Control" content="no-cache"> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#000000" text="#FFFF00">
htmtags
}


sub footer{
print <<'htmtags'
</body>
</html>
htmtags
}


Этот скрипт без проблем работает и браузер ждет пока  скрипт полностью выполниться и постепенно выводит результат.

Но стоит в цикле использовать LWP - соединение теряется, как я и описывал выше.
Может администраторы хостинга  специально уменьшают минимальный таймаут ответа =(

Автор: shamber 18.2.2010, 09:59
Цитата(d0k @  17.2.2010,  16:49 Найти цитируемый пост)
Может администраторы хостинга  специально уменьшают минимальный таймаут ответа =(

вполне возможно... никому не хочется чтобы их сервак вешали smile

Автор: Nab 19.2.2010, 03:29
Цитата(d0k @  17.2.2010,  16:49 Найти цитируемый пост)
Но стоит в цикле использовать LWP - соединение теряется, как я и описывал выше.Может администраторы хостинга  специально уменьшают минимальный таймаут ответа =(

Хахаха smile
Большинство хостеров вообще запрещают коннект с хоста наружу. Чтоб не рисовали свои прокси не  строили ботнеты и т.д. Тем более в цикле smile 

Спросите у своего хостера, разрешает ли он исходящие соединения.

Автор: tishaishii 19.2.2010, 18:50
Есть такая схема работы клиент\сервер, называется NPH - вывод документа по частям, когда соединение не разрывается, покуда работает скрипт.

http://perldoc.perl.org/CGI.html#USING-NPH-SCRIPTS

Автор: Nab 22.2.2010, 13:56
tishaishii, внимательно ознакомтесь с тем что предлагаете, вы вообще пробовали расшифровать что значит NPH?

Автор: d0k 28.2.2010, 22:36
Всем спасибо за советы, разобрался: админы хостинга таймауты при исходящих запросах сократили до 1с, почему так и не объяснили. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)