![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
В редакторе DzSoft Perl Editor есть кнопка "Run", выполняю скрипт, на экране с задержкой 5 сек. одномоментно появляются все строки. В командной строке dos выполняю команду:> perl myscript.pl тут все как полагается, сначала первая строка, потом пауза, потом вторая строка, потом пауза и т.д. Набираю в браузере адрес на своем сайте этого скрипта - пауза, потом сразу все строки, одновременно сразу все. Вопрос: Можно ли вообще и самое главное как получить в браузере эти же самые строки с заданными паузами между появлением каждой из строк? Отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится? |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Можно. Для этого нужно установить автоматический сброс буфера в начале скрипта.
|
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Прочитал:
$| - если присвоить этой переменной не нулевое значение то будет сброс буфера вывода после каждой операции вывода. Значение по умолчанию - 0. Сделал: в начале скрипта $|=1; Результат: Никакой. ПК - windows, Chrome, сервер - unix, apache. За этот сброс буфера и раньше читал, но и до сих пор этот момент не получается выполнить как везде пишут. Что я не так делаю? |
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Может все происходит так как и задумано, с паузами, но как это увидеть?
Браузер может что то по своему отображает, поэтому пробую с помощью perl посмотреть:
Результат отрицательный. Не получается печатать с сервера с паузами. Вопрос не академический, но имеет практическую направленность. Это сообщение отредактировал(а) Сisa - 19.1.2013, 11:34 |
|||
|
||||
| Pfailed |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
С помощью perl правильно смотреть так:
Добавлено через 8 минут и 25 секунд Вот этот код у меня работает в хроме. Похоже, что этот браузер имеет некий буфер, который пока не заполнится вывод не начнется. Это обходится вставкой html комментария на 1 кб в 4-ой строке.
Добавлено через 12 минут и 52 секунды Кстати было бы неплохо если бы вы описали первоначальную задачу. Скорее всего ее можно было бы решить более красиво. Обычно в подобных вещах используют Ajax. А долго выполняющийся скрипт в браузере это костыль, который не у всех и заработает. |
||||
|
|||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
ajax, js - нет, надо именно perl
Это не основная задача, Вы правы, Pfailed, но выбран этот пример для того чтобы понять как это действует.
Код немного изменил выдачу в браузере, но чисто визуально, а по времени представления информации нет, т.е. без пауз нет. Вот хочу все же увидеть ответ на вопрос, и пока не получается: Отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится? Основной вопрос: запускаю многопоточного демона слушающего порт по сокету точно так же, из адресной строки браузера, и браузер зависает в ожидании ответа с сервера. А ответ должен быть примерно такой: все ОК, и демон запущен, т.е. как бы отчет о запуске. Как получить такой ответ с сервера в браузер? |
|||
|
||||
| Pfailed |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Отдает, я ведь написал, что у меня работает. А вы не написали что выдаёт проверочный perl скрипт.
Запускать демона из веб-процесса плохо, как минимум, из соображений безопасности. Обычно демона запускают под рутом и при старте он переходит под специально отведенного пользователя. По хорошему нужен job server, который будет запускать демона, а уже с job сервером веб-скрипт может общаться через unix или tcp сокет. От этого же job сервера через ajax можно получать статус запуска и проблема с долго загружающейся страницей исчезнет. Так проблема в том что вы вообще не можете получить ответ или в том, что на время запуска страница подвисает? |
||||
|
|||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Проверочный perl скрипт выдаёт:
Добавлено @ 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 не завершил свою работу, то апач в браузер ничего не отправляет, и браузер напрасно ждет ответ сервера в этом случае. Как обойти этот момент неведомо (мне). Или там ошибка моя какая нибудь есть. Но по крайней мере мой демон работает в течение часа нормально. А потом умирает! Вот собственно с чего и началось И чего он умирает? Предположительно, в апаче какая то настройка - ограничение по времени установлена. Это сообщение отредактировал(а) Сisa - 19.1.2013, 17:49 |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Значит у вас неправильный демон. Правильный должен отсоединяться от управляющего терминала и продолжать свою работу в бекграунде. В данном случае если бы демон как положено отсоединялся, то не подвешивал бы веб-страницу. Демон легко создать, например с помощью модуля Proc::Daemon. Или вручную (пример из книги "Network Programming with Perl"):
|
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Отсоединяется, fork есть, разделение процессов есть, родитель и должен по идее отчитаться, что дочерний в это самое время слушает порт, или наоборот.
Самоделки наверно и правда сложно, но с gearman.org еще сложнее Мне удалось все же запустить и демона и страницу получить в браузер, понятно что через костыли, но Вы абсолютно правы демон неправильный!, и вообще идея неправильная всей страницы. А вот отдает ли апач в браузер html частями или только тогда, когда весь скрипт на сервере выполнится? Вот в чем вопрос, быть или не быть! |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Показывайте свой код. Иначе сложно сказать что там работает неверно.
Уточню. Апач отдаёт контент по мере поступления если его не просят сделать с этим контентом какое либо действие перед отдачей клиенту. Частым примером такого действия является сжатие, например, по алгоритму gzip. Решается, например, отключением apache модуля deflate. |
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Апач не отдает контент частями. Пока не удалось это увидеть. Прикрепляю архивчик с тремя скринами, где в Chrome (Network - Timeline - Waiting) единая единая пауза ожидания строк, всех сразу.
Использовал те примеры скриптов perl, что приведены выше в сообщениях этого поста. Может apache у моего хостера и имеет какие то определенные настройки модулей что то изменяющие в выдаче контента, а также во времени работы демона, чтобы это выяснить и пытаю у Вас этот момент и какие именно настройки мешают. Присоединённый файл ( Кол-во скачиваний: 0 )
p000.rar 132,98 Kb |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Посмотрите в хроме на наличие хедера Content-Encoding в ответе вашего хоста. То о чем я писал выше Присоединённый файл ( Кол-во скачиваний: 11 )
s.png 221,69 Kb |
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Вы не видите здесь строки "Content-Encoding:gzip"? Посмотрите внимательнее. Повредит. Сервер сначала собирает данные полученные от скрипта в буфер, затем уже все вместе сжимает и отдаёт клиенту.
А у меня модуль deflate отключен и контент не сжимается и выдаётся по мере поступления от скрипта. Кстати, вы уверены, что у вас Apache? В хедерах фигурирует "Server:nginx". |
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |