Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> html частями, Получить паузу в браузере 
:(
    Опции темы
Сisa
Дата 19.1.2013, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Код

#!/usr/bin/perl
print "Content-type: text/html\n\n"; print "<html>\n";
my $a=0,sleep($a),print "Sleep ".$a++." sec\n" while($a<6);

В редакторе DzSoft Perl Editor есть кнопка  "Run", выполняю скрипт, на экране  с задержкой 5 сек. одномоментно появляются все строки.
В командной строке dos выполняю команду:>      perl myscript.pl
тут все как полагается, сначала первая строка, потом пауза, потом вторая строка, потом пауза и т.д.
Набираю в браузере адрес на своем сайте этого скрипта - пауза, потом сразу все строки, одновременно сразу все.
Вопрос: 
Можно ли вообще и самое главное как получить в браузере эти же самые строки с заданными паузами между появлением каждой из строк?

Отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится?
PM MAIL   Вверх
Pfailed
Дата 19.1.2013, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Можно. Для этого нужно установить автоматический сброс буфера в начале скрипта.



--------------------
PM MAIL   Вверх
Сisa
Дата 19.1.2013, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Прочитал:
$| - если присвоить этой переменной не нулевое значение то будет сброс буфера вывода после каждой операции вывода. Значение по умолчанию - 0.
Сделал:
в начале скрипта    $|=1;
Результат:
Никакой.
ПК - windows, Chrome,   сервер  - unix, apache. За этот сброс буфера и раньше читал, но и до сих пор этот момент не получается выполнить как везде пишут. Что я не так делаю?


PM MAIL   Вверх
Сisa
Дата 19.1.2013, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Может все происходит так как и задумано, с паузами, но как это увидеть?
Браузер может что то по своему отображает, поэтому пробую с помощью perl посмотреть:
Код

use LWP::UserAgent;
my $url = "http://www.google.com"; # тут мой адрес файла perl а не google.com  :)
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
if ($res->is_success) { 
 print $res->content;
}else {
 print "No";
}

Результат отрицательный. Не получается печатать с сервера с паузами.
Вопрос не академический, но имеет практическую направленность.

Это сообщение отредактировал(а) Сisa - 19.1.2013, 11:34
PM MAIL   Вверх
Pfailed
Дата 19.1.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



С помощью perl правильно смотреть так:

Код

use LWP::UserAgent;
$| = 1;
my $url = "http://www.google.com"; # тут мой адрес файла perl а не google.com  :)
my $ua = LWP::UserAgent->new;
my $res = $ua->get($url, ':content_cb' => sub {
        print $_[0];
});


Добавлено через 8 минут и 25 секунд
Вот этот код у меня работает в хроме. Похоже, что этот браузер имеет некий буфер, который пока не заполнится вывод не начнется. Это обходится вставкой html комментария на 1 кб в 4-ой строке.
Код

#!/usr/bin/perl
$| = 1;
print "Content-type: text/html\n\n"; print "<html>\n";
print "<!--", "X"x1024, "-->", "\n";
my $a=0,sleep($a),print "Sleep ".$a++." sec<br>\n" while($a<6);


Добавлено через 12 минут и 52 секунды
Кстати было бы неплохо если бы вы описали первоначальную задачу. Скорее всего ее можно было бы решить более красиво.
Обычно в подобных вещах используют Ajax. А долго выполняющийся скрипт в браузере это костыль, который не у всех и заработает.



--------------------
PM MAIL   Вверх
Сisa
Дата 19.1.2013, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



ajax, js - нет, надо именно perl
Это не основная задача, Вы правы, Pfailed, но выбран этот пример для того чтобы понять как это действует. 
Код

#!/usr/bin/perl
$| = 1;
print "Content-type: text/html\n\n"; print "<html>\n";
print "<!--", "X"x1024, "-->", "\n";
my $a=0,sleep($a),print "Sleep ".$a++." sec<br>\n" while($a<6);

Код немного изменил выдачу в браузере, но чисто визуально, а по времени представления информации нет, т.е. без пауз нет. 
Вот хочу все же увидеть ответ на вопрос, и пока не получается: 
Отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится?

Основной вопрос: 
запускаю многопоточного демона слушающего порт по сокету точно так же, из адресной строки браузера, и браузер зависает в ожидании ответа с сервера. А ответ должен быть примерно такой: все ОК, и демон запущен, т.е. как бы отчет о запуске. Как получить такой ответ с сервера в браузер?
PM MAIL   Вверх
Pfailed
Дата 19.1.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата

Отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится?

Отдает, я ведь написал, что у меня работает. А вы не написали что выдаёт проверочный perl скрипт.

Цитата

Основной вопрос:

Запускать демона из веб-процесса плохо, как минимум, из соображений безопасности. Обычно демона запускают под рутом и при старте он переходит под специально отведенного пользователя. По хорошему нужен job server, который будет запускать демона, а уже с job сервером веб-скрипт может общаться через unix или tcp сокет. От этого же job сервера через ajax можно получать статус запуска и проблема с долго загружающейся страницей исчезнет.


Цитата(Сisa @  19.1.2013,  12:49 Найти цитируемый пост)
Как получить такой ответ с сервера в браузер? 

Так проблема в том что вы вообще не можете получить ответ или в том, что на время запуска страница подвисает?



--------------------
PM MAIL   Вверх
Сisa
Дата 19.1.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Проверочный perl скрипт выдаёт:
Код

<html>
<!--XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-->
Sleep 0 sec<br>
Sleep 1 sec<br>
Sleep 2 sec<br>
Sleep 3 sec<br>
Sleep 4 sec<br>
Sleep 5 sec<br>


Добавлено @ 17:47
В браузере (и не только в  Chrome, но и в IE, и в FF) ответ точно такой же как и для perl, 
и визуально в окне браузера появляются строки:
Sleep 0 sec
Sleep 1 sec
Sleep 2 sec
Sleep 3 sec
Sleep 4 sec
Sleep 5 sec
причем все строки одновременно, без пауз. Поэтому я и не увидел отдает ли апач в браузер html 
частями или целиком сразу все что написал perl-скрипт.

Рута у меня нет, он у хостера. У меня не vds, а обычный виртуальный хост.
job server поиск в google пока только и смог найти что это задание выполняемое по расписанию,
как такое сделать - наверно через cron может, не пробовал.

Как получить такой ответ с сервера в браузер? - проблема в том что ответ с сервера не приходит вообще, 
т.е. и через длительное время тоже. Страница подвисает не на время запуска, а во время запуска.
Видимо это происходит в точке $client = $socket->accept т.е. пока включается демон, программа
работает, но пока perl не завершил свою работу, то апач в браузер ничего не отправляет, и браузер
напрасно ждет ответ сервера в этом случае. Как обойти этот момент неведомо (мне). Или там ошибка
моя какая нибудь есть. Но по крайней мере мой демон работает в течение часа нормально. 
А потом умирает! Вот собственно с чего и началось smile  
И чего он умирает? Предположительно, в апаче какая то настройка - ограничение по времени установлена.


Это сообщение отредактировал(а) Сisa - 19.1.2013, 17:49
PM MAIL   Вверх
Pfailed
Дата 19.1.2013, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Значит у вас неправильный демон. Правильный должен отсоединяться от управляющего терминала и продолжать свою работу в бекграунде. В данном случае если бы демон как положено отсоединялся, то не подвешивал бы веб-страницу. Демон легко создать, например с помощью модуля Proc::Daemon.  Или вручную (пример из книги "Network Programming with Perl"):
Код

use POSIX 'setsid';

sub become_daemon {
  die "Can't fork" unless defined (my $child = fork);
  exit 0 if $child;
  setsid();
  open STDIN, '</dev/null';
  open STDOUT, '>/dev/null';
  open STDERR, '>&STDOUT';
  umask(0);
  return $$;
}



--------------------
PM MAIL   Вверх
Сisa
Дата 19.1.2013, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Отсоединяется, fork есть, разделение процессов есть, родитель и должен по идее отчитаться, что дочерний в это самое время слушает порт, или наоборот.
Самоделки наверно и правда сложно, но с gearman.org еще сложнее  smile 

Мне удалось все же запустить и демона и страницу получить в браузер, понятно что через костыли, но Вы абсолютно правы демон неправильный!, и вообще идея неправильная  всей страницы.

А вот отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится? 
Вот в чем вопрос, быть или не быть! 
PM MAIL   Вверх
Pfailed
Дата 20.1.2013, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Показывайте свой код. Иначе сложно сказать что там работает неверно.

Цитата(Сisa @  19.1.2013,  19:51 Найти цитируемый пост)
А вот отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится? 

Уточню. Апач отдаёт контент по мере поступления если его не просят сделать с этим контентом какое либо действие перед отдачей клиенту. Частым примером такого действия является сжатие, например, по алгоритму gzip. Решается, например, отключением apache модуля deflate.


--------------------
PM MAIL   Вверх
Сisa
Дата 20.1.2013, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Апач не отдает контент частями. Пока не удалось это увидеть. Прикрепляю архивчик с тремя скринами, где в Chrome (Network - Timeline - Waiting) единая единая пауза ожидания строк, всех сразу. 
Использовал те примеры скриптов perl, что приведены выше в сообщениях этого поста. 
Может apache у  моего хостера и имеет какие то определенные настройки модулей что то изменяющие в выдаче контента, а также во времени работы демона, чтобы это выяснить и пытаю у Вас этот момент и какие именно настройки мешают.


Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  p000.rar 132,98 Kb
PM MAIL   Вверх
Pfailed
Дата 20.1.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(Сisa @ 20.1.2013,  12:32)
Может apache у  моего хостера и имеет какие то определенные настройки модулей что то изменяющие в выдаче контента, а также во времени работы демона, чтобы это выяснить и пытаю у Вас этот момент и какие именно настройки мешают.

Посмотрите в хроме на наличие хедера Content-Encoding в ответе вашего хоста. То о чем я писал выше

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  s.png 221,69 Kb


--------------------
PM MAIL   Вверх
Сisa
Дата 20.1.2013, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Это хром с форума:

Request URL:http://forum.vingrad.ru/forum/topic-361227/kw-%D0%BF%D0%B0%D1%83%D0%B7%D0%B0-apache-html-%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80.html
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utmz=20740015.1358520811.3.2.utmccn=(referral)|utmcsr=google.com.ua|utmcct=/|utmcmd=referral; pforumforum_read=a%3A1%3A%7Bi%3A183%3Bi%3A1358525527%3B%7D; pforummember_id=157687; pforumpass_hash=fb74cddbed536fad44c2b1c6986db617; __utma=20745.3201.138845.17663.16964.18; __utmb=20745; __utmc=2000015; pforumsession_id=446fd5656689898530c4523416474cb
Host:forum.vingrad.ru
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
Response Headersview source
Cache-Control:no-store, no-cache, must-revalidate
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Sun, 20 Jan 2013 15:44:39 GMT
Expires:Sun, 20 Jan 2013 15:44:39 +0000
Server:nginx/1.1.15
Set-Cookie:pforumsession_id=446fdd847114548; path=/; domain=.vingrad.ru
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1~dotdeb.1


А это с моего сайта:

Request URL:http://...мойсайт.../cgi-bin/sleep3.pl
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Host:...мой сайт...
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
Response Headersview source
Cache-Control:max-age=1
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 20 Jan 2013 15:43:54 GMT
Expires:Sun, 20 Jan 2013 15:43:53 GMT
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding

Указанной Вам строки (Content-Encoding) с моего сайта нет.
Читаю:
Сжатие запросов и ответов http-сервера позволяет значительно улучшить производительность обработки http-запросов за счет уменьшения объёма передаваемых данных.
Использование сжатия http-запросов позволяет уменьшить трафик в два и более раз.
И при чем здесь Content-Encoding ? 
Цитата

 Апач отдаёт контент по мере поступления если его не просят сделать с этим контентом какое либо действие перед отдачей клиенту. 

Тем более, у меня и нет Content-Encoding среди хедер, я и не прошу сервер сделать с этим контентом какое либо действия перед отдачей клиенту, пусть себе отдает, что этому мешает?
Но даже если бы и gzip, то разве это повредит? а вот у Вас есть, и у Вас при выдаче строк с сервера несколько пауз и несколько выдач?


Это сообщение отредактировал(а) Сisa - 20.1.2013, 19:18
PM MAIL   Вверх
Pfailed
Дата 20.1.2013, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(Сisa @  20.1.2013,  19:06 Найти цитируемый пост)
А это с моего сайта:

Request URL:http://...мойсайт.../cgi-bin/sleep3.pl
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Host:...мой сайт...
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
Response Headersview source
Cache-Control:max-age=1
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 20 Jan 2013 15:43:54 GMT
Expires:Sun, 20 Jan 2013 15:43:53 GMT
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding



Цитата(Сisa @  20.1.2013,  19:06 Найти цитируемый пост)
Указанной Вам строки (Content-Encoding) с моего сайта нет.

Вы не видите здесь строки "Content-Encoding:gzip"? Посмотрите внимательнее.

Цитата(Сisa @  20.1.2013,  19:06 Найти цитируемый пост)
Но даже если бы и gzip, то разве это повредит?

Повредит. Сервер сначала собирает данные полученные от скрипта в буфер, затем уже все вместе сжимает и отдаёт клиенту.

Цитата(Сisa @  20.1.2013,  19:06 Найти цитируемый пост)
а вот у Вас есть, и у Вас при выдаче строк с сервера несколько пауз и несколько выдач?

А у меня модуль deflate отключен и контент не сжимается и выдаётся по мере поступления от скрипта.
Кстати, вы уверены, что у вас Apache? В хедерах фигурирует "Server:nginx".


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.