Forum Webscript.Ru

Программирование => Perl => Тема начата: cooler.com.ua от 01 Июня 2003, 16:28:15

Название: Конец работы скрипта на Perl
Отправлено: cooler.com.ua от 01 Июня 2003, 16:28:15
Здравствуйте!

У меня к вам вот какой вопросик:

допустим есть такой скрипт (test.pl):

while (1) {
 syswrite(STDOUT, "test");
}

Запускаем его теперь вот таким образом: http://localhost/cgi-bin/test.pl

Потом я нажимаю в браузере кнопку "стоп". Так вот скрипт продолжает свою работу. Как мне сделать так, чтобы после нажатия кнопки "стоп" в браузере скрипт завершил свою работу. Заранее благодарен.
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 02 Июня 2003, 10:59:31
Никак. Скрипт выполняется на сервере а кнопка стоп на клиенте.
Название: Конец работы скрипта на Perl
Отправлено: NCRangeR от 03 Июня 2003, 05:26:38
cooler.com.ua

Можно в выводимом окне сделать невидимый фрейм, который будет обращаться к скрипту isAlive.pl, который в свою очередь будет записывать время последнего обращения в файл.
Обращение будет происходить по пришествии каждой новой порции информации, можно, например, это сделать, заменив
syswrite (STDOUT, "test");
на
syswrite (STDOUT, "test");

test.pl в каждом цикле будет считывать время последнего обращения, и если, предположим, уже 20 секунд не было обращений, делать exit (0);

Надеюсь, что несмотря на возможные ошибки, в принципе идея ясна ;)
Название: Конец работы скрипта на Perl
Отправлено: cooler.com.ua от 03 Июня 2003, 08:51:15
2 NeoNox:

Вообщем на PHP как-то это реализова но же ... Там если теряется связь с клиентом то скрипт автоматом прекращает свою работу, мало того, есть возможность зарегистрировать ф-цую, которая будет выполняться именно тогда, когда завершит связь клиент.
Название: Конец работы скрипта на Perl
Отправлено: cooler.com.ua от 03 Июня 2003, 08:54:18
2 NCRangeR:

Спасибо большое за предложение, но это как-то геморойно ... хотелось бы какую-то функцию, которая проверяет не отключился ли клиент.
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 11:17:40
Цитировать
cooler.com.ua:
Вообщем на PHP как-то это реализова но же

Не верю. Потому как скрипт на сервере а кнопка на клиенте.
Все сделано одним из вариантов похожим на вариант NCRangeR.
Цитировать
cooler.com.ua:
хотелось бы какую-то функцию, которая проверяет не отключился ли клиент.

Куда отключился? Из сети?
Тогда perldoc Net::Ping
Или закрыл текущее окно?
perldoc Is::My::Window::Not::Closed ;)
Название: Конец работы скрипта на Perl
Отправлено: cooler.com.ua от 03 Июня 2003, 11:33:00
2 NeoNox:

Да что тут непонятного ... когда клиен обращаетсмя но адесу http://chat.net.ua/index.php то апач обрабатывает это запрос с помощью ПХП. Когда клиент отключается от скрипта или как тебе еще объяснить (перестает получать данные от скрипта) то апач говорит PHP "кончай работать :)" и скрипт PHP завершает работу в какой бы стадии выплнения он не находился. Понимаешь? А перловый скрипт не завершается а висит в памяти. Вот.

Понимаешь в чем вопрос?
Название: Конец работы скрипта на Perl
Отправлено: Xander от 03 Июня 2003, 11:55:58
NeoNox
cooler.com.ua

с одной стороны мне кажется, что это чушь - про разъединения, апач и PHP. А вот с другой - и правда, что именно происходит при разрыве соединения с клиентом?
Это же не UDP, а TCP/IP, и устанавливается, насколько я понимаю, виртуальный канал между клиентом и сервером. А его разрыв отследить можно...
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 12:14:59
Цитировать
cooler.com.ua:
скрипт PHP завершает работу в какой бы стадии выплнения он не находился. Понимаешь?

Я то понимаю а вот ты нет.
Почитай ПХП на танке http://faq.phpclub.net/na_tanke
раздел "Отличие веб-приложения от обычной программы"
[OFF]надо такой и в perl создать...[/OFF]
Что там видим?
Цитировать
Сервер и браузер общаются, посылая друг другу запросы по особому протоколу - HTTP. Соединение может инициировать только браузер. Он посылает серверу запрос - показать такой-то файл. Сервер клиенту файл посылает.
Только так и происходит. Клиент запросил - сервер отдал. И забыл сразу о клиенте. Остюда становится понятным ответ на вопрос, можно ли точно узнать, сколько юзеров сечас на сайте. Нельзя. потому, что "на сайте" нету ни одного. Они соединяются, запрашивают страницу, и отсоединяются. Не имеют постоянного оединения с сервером, как, например, игроки в Кваку. Узнать можно только примерно, записывая время каждого соединения и выбирая записи за определенный промежуток времени.

Доступно?
А теперь задавай свой конкретный вопрос.
Название: Конец работы скрипта на Perl
Отправлено: Макс от 03 Июня 2003, 12:25:05
пхп (AFAIK) может определить разорвано ли соединение только при попытке послать что-то клиенту.
То есть (для тех кто не понял), если в скрипте происходят какие-то вычиления без вывода клиенту, он (скрипт) не может определить на связи ли клиент, но если скрипт попытется послать клиенту какой-то HTTP-заголовок или текст, вот тут ПХП и может определить, разорвано ли соединение.

Вобщем-то ведь ничто не мешает скрипту посылть какой-то левый ХТТП-заголовок (как кстати делают некоторые скрипты) и если этот ХТТП-заголовок нормально шлется, значит соединение не разорвано
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 12:36:35
Цитировать
Макс:
Вобщем-то ведь ничто не мешает скрипту посылть какой-то левый ХТТП-заголовок (как кстати делают некоторые скрипты) и если этот ХТТП-заголовок нормально шлется, значит соединение не разорвано

Перечитай еще раз... Сервер то может послать.
Но броузер ничего не пошлет на сервер без юзера. (скрипт видит что у пользователя истек таймаут на время последнего запроса и нужно его убрать из списка кто онлайн)
Выход -  пингануть, но где гарантия что у пользователя вообще броузер запущен? Это все теория...
В следующий раз отправлю читать RFC ;)
Название: Конец работы скрипта на Perl
Отправлено: Xander от 03 Июня 2003, 12:46:27
NeoNox
а если так: скрипт что-то длинное выводит, и в этот момент юзер закрывает браузер или жмет stop. Что происходит?
Название: Конец работы скрипта на Perl
Отправлено: Макс от 03 Июня 2003, 13:07:53
NeoNox
ИМХО скрипт онлайн-пользователей к данному вопросу не имеет значение. Xander уже описал проблему:
Цитировать
скрипт что-то длинное выводит, и в этот момент юзер закрывает браузер или жмет stop. Что происходит?
и я так понимаю, автора темы интересует, как отследить момент разрыва соединения. В php эта фича присутствует и мне не верится, что в перл нет такой возможности
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 13:10:34
Xander вопрос видел?
#!/usr/bin/perl
use CGI qw(:standard);
print header;

print "Test \\n";

open(OUT, ">./test");
while (1) {
print OUT "=====  Begin  =====\\n";
}
print OUT "====== End ======\\n";
close OUT;

Сколько нужно раз нажать на кнопку "стоп"?
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 13:11:46
Макс
Дай мне эту фичу в PHP. Я обещаю ее досконально изучить.
Название: Конец работы скрипта на Perl
Отправлено: Макс от 03 Июня 2003, 13:18:24
NeoNox
http://ua.php.net/manual/en/features.connection-handling.php
http://ua.php.net/manual/en/function.connection-aborted.php
http://ua.php.net/manual/en/function.connection-status.php
http://ua.php.net/manual/en/function.connection-timeout.php
http://ua.php.net/manual/en/function.ignore-user-abort.php
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 13:24:28
Макс
Ааа в таком ключе... В руки тебе хеш %SIG.
Название: Конец работы скрипта на Perl
Отправлено: Xander от 03 Июня 2003, 13:41:17
NeoNox
то есть, когда клиент отваливается - скрипту посылается SIGHUP или что-то вроде него?
А он разве по умолчанию не дохнет?
Нужно обработчик писать?
Название: Конец работы скрипта на Perl
Отправлено: NeoNox от 03 Июня 2003, 13:48:14
Серверу...

Вот тебе для размышления
Не отваливается:
open(OUT, ">./test");
while (1) {
print OUT "===== Begin =====\\n";
}
print OUT "====== End ======\\n";
close OUT;
и отваливается:

while (1) {
print "===== Begin =====\\n";
}


Почему так происходит понятно?
Название: Конец работы скрипта на Perl
Отправлено: cooler.com.ua от 03 Июня 2003, 15:38:53
2 NeoNox:

Читай внимательней вопрос - уже помоему все поняли чего я спрашивал, кроме тебя.