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


Автор: Riddick 6.7.2007, 14:32
Блин обыскался! Допустим у меня работает процесс и записывает все в лог файл, как получить статистику понятно. Не понятно как сделать редирект на статистику при запуске процесса, тоесть чтоб юзер запустил процесс и его сразу редиректило на страницу статсов, а процесс как работал, так и работает, пока не закончится.

Попробовал так

Код


my $t=4000;
my $i=1;

print <<EOF;

<script>
location.href="itog.cgi";
</script>

EOF

while ($i <= 4000){

#Производим нужные вычисления
#Делаем запись в лог файл

$i++;

}



не получается, редир происходит, но только после завершения процесса, пробовал так:

Код


my $t=4000;
my $i=1;
my $flag=1;


while ($i <= 4000){

if ($flag == 2){

print <<EOF;

<script>
location.href="itog.cgi";
</script>

EOF
}

#Производим нужные вычисления
#Делаем запись в лог файл

$flag=2;

$i++;

}



результаты получил аналогичные.

Может гдето неправильно опять что-то делаю smile 

Автор: KSURi 6.7.2007, 16:56
Код

while {$i <= 4000){

эээ, имхо так не должно быть

Автор: Riddick 6.7.2007, 18:12
Отредактировал, просто суть вопроса не меняется.

Автор: Nab 6.7.2007, 20:54
Riddick, чет вы путаете, JavaScript здесь излишен, а по поводу процесса генерящего статистику пожалуйста подробнее. 
В большинстве случаев веб процессы не могут работать бесконечно, и просто перенаправить а продолжать работать не очень просто... Мало того что на такие действия нужны права в системе, так еще и вебсервер может иметь ограничения к примеру на время выполнения скрипта...

Автор: Riddick 6.7.2007, 21:04
Процесс не генерит статитстику, а работает так как ему нужно, просто после каждой итерации записывает результат в лог файл. Так вот при запуске данного скрипта юзером, браузер врятли дождется ответа потому как процесс будет работать около 2-3х часов. Отсюда следует что после запуска юзером скрипта его нужно сразу же перенаправить на другой скрипт который будет отображать данные лога. Весь затык я не пойму как перенаправить юзера.
По поводу времени выполнения, то оно как раз и неограничено.

Автор: JAPH 6.7.2007, 22:18
Предположу:
Код

#!perl -wT
print "Location: itog.cgi\n\n";
# <...>


P.S. А если юзеров многа (или один, но настойчивый)? И каждый по процессику. На 2-3 часа. smile

Автор: Riddick 6.7.2007, 22:25
Юзеров не много, счас буду проверять предположение, хотя помоему не выйдет ничего, а там кто его знает.

Автор: JAPH 6.7.2007, 22:51
Не вышло :(
А если
Код

#!perl -w
use strict; use warnings;
print "Location: itog.cgi\n\n";
$| = 1;
exec 'perl -w longwork.pl';

Автор: dya 8.7.2007, 21:02
Хм, возможно я не правильно понял вопрос …
Но не проще ли будет, непосредственно на этой страницы отображать процесс? То есть выводить логии никуда не переходя?

А так возможно вам это подойдёт.
Код
#Переадресация произойдет через 0 секунд.
print '<meta http-equiv=Refresh content="0; URL=/script.html">';

Автор: JAPH 8.7.2007, 23:58
dya, 
Цитата
Переадресация произойдет через 0 секунд.
 Вы ошибаетесь. Проверьте на таком скрипте, через сколько произойдёт переадресация:
Код

#!perl -wT
print "Content-type: text/html; charset=windows-1251\n\n";
print '<meta http-equiv=Refresh content="0; URL=/script.html">';
sleep 10;


Ну, хорошо, по сути самой вашей идеи. Представьте: каждый заход на страницу порождает двух-трёхчасовой процесс. А вы предлагаете, запустив один такой процессик, запускать сразу ещё один, а потом ещё, ... Пожалейте сервер smile

Автор: dya 9.7.2007, 12:49
JAPH, 
http://www.html-reference.com/META_httpequiv_refresh.htm

Добавлено через 2 минуты и 34 секунды
http://www.softtime.ru/javascript/redirecthtml.php

Автор: JAPH 9.7.2007, 13:05
Гм, теория - это хорошо, только ничё нового я не узнал smile

Цитата из первого поста:
Цитата
не получается, редир происходит, но только после завершения процесса

Здесь то же. Пока скрипт не отработает, редиректа не будет. То есть 0 секунд после того, как загрузится страница, а это после того, как отработает скрипт, в сумме 10 секунд, а в задаче автора 2-3 часа.
+ предыдущий пост про суть вашей идеи.

Автор: amg 9.7.2007, 13:33
Может, я чего не понимаю, но почему не сделать так, чтобы процесс создал потомка, который потом будет в течение 2-3 часов что-то делать, а сам родительский процесс сделает редирект куда надо и тут же завершиться.

Автор: Riddick 9.7.2007, 23:09
А на сколько реально с потомком? Мне не нужен именно редирект, мне нужно чтобы процесс работал, а браузер отображал его работу. 
Про потомка тоже не понятно, такое действительно может быть что потомок пашет а родитель завершил работу? Если да это хорошо, попробую, если не получится отпишу.

Автор: amg 10.7.2007, 07:48
Цитата(Riddick @  9.7.2007,  23:09 Найти цитируемый пост)
такое действительно может быть что потомок пашет а родитель завершил работу?

Да, конечно. Демонизация называется.
Вот это работает в linux. В windows, скорее всего, работать не будет, но, наверное, и там можно что-нибудь придумать.
Код

use POSIX 'setsid';

defined(my $pid = fork) or die "Can't fork: $!";

if ($pid) {
  print "I'm $$, my child is $pid. Die...\n";
  # Код редиректа
  exit;
}

setsid or die "Can't start a new session: $!";
sleep 5;
print "\nI'm $$, my parent is ", getppid;
# Код получения статистики
exit;

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