Forum Webscript.Ru

Программирование => Perl => Тема начата: Yaroslav от 27 Июня 2003, 15:36:37

Название: 2 вопроса
Отправлено: Yaroslav от 27 Июня 2003, 15:36:37
подскажите знающие люди, как сделать что б логин проверялся на наличие русских букв, что то типа:
if ($login eq \'руские буквы\') { что то там }

и еще, есть часть скрипта
sub add {                                    #добавляет нужную строчку в файл
$s=0;
open (MSG, "$file");
@msg=;
close(MSG);
open (FILE, ">$file");
   foreach $line (@msg) {
   if ($s == $str) {              #$str- номер нужной строчки
      if ($sp eq "0") { print FILE "$sp`$text\\n$line"; }
      }
   else { print FILE "$line"; }
   $s++; }
close(FILE);
print "ок.\\n";
&mail;                                       #открывает файл и построчно отправляет $email (около80)
}

вот вопрос, что то он уж очень долго думает, что подскажите предпринять?
кстати, он мне этот print "ок.\\n"; выдаст только после того как отправит все &mail; или сначала напишет а потом будет отправлять?
Название: 2 вопроса
Отправлено: Wyclef от 27 Июня 2003, 16:40:16
Цитировать
что б логин проверялся на наличие русских букв

if ($login =~ /[^a-z]+/i) {
    print "Допустимы только латинские символы!\\n";
}

Цитировать
или сначала напишет, а потом будет отправлять?

В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.
Название: 2 вопроса
Отправлено: Yaroslav от 27 Июня 2003, 17:33:14
Цитировать
Wyclef:
if ($login =~ /[^a-z]+/i) {
    print "Допустимы только латинские символы!\\n";
}

спасибо, работает

Цитировать
Wyclef:
В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.

так вот почему он так долго думает....
как решить этот вопрос подскажешь?
Название: 2 вопроса
Отправлено: Wyclef от 28 Июня 2003, 21:53:45
Цитировать
Yaroslav:
как решить этот вопрос подскажешь?

Можно решить при помощи cron\'a.

Т.е. добавляешь в cron скрипт (отдельный), который непосредственно осуществляет отправку писем и который, в свою очередь, "смотрит" не изменились ли какие-либо параметры (например спец. поле в БД и т.п.) и нужно отправить письма.

А скриптом, где у тебя sub add, ты где нужно (например там где стоит &mail;) эти самые параметры и меняешь и т.д.

...Надеюсь понятно объяснил? :)
Название: 2 вопроса
Отправлено: Mog. от 29 Июня 2003, 09:39:06
Цитировать
Wyclef:
В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.
Почему ? Если где то в скрипте есть print "Content-type: text/html\\n\\n"; (раньше чем print "ok";) то и в браузере сначала напишет ок, а потом займется отправкой писем.

Цитировать
Wyclef:
Можно решить при помощи cron\'a.
А можно и при помощи print "Location:  куда нибудь\\n\\n";
Название: 2 вопроса
Отправлено: Wyclef от 29 Июня 2003, 15:38:01
Цитировать
Mog.:
Если где то в скрипте есть print "Content-type: text/html\\n\\n";
Mog.:
А можно и при помощи print "Location: куда нибудь\\n\\n";

Не проможет...

Я раньше подобную тему поднимал (только там было про upload). Советовали fork. Грабли примерно те же...
Название: 2 вопроса
Отправлено: Mog. от 29 Июня 2003, 15:45:47
2Wyclef
Уверен? Про аплоад я помню, но там другая история. Там был долгий http запрос, потому скрипт не начинал выполнятся до его завершения и fork не имел смысла. Здесь, если чел хочет быстро-быстро увидеть "Ok!", мона сделать location на этот окей, а скрипт потихонечку будет дошуршивать, рассылая мыло. Браузер, ведь, только команды будет слать, а все что будет делаться, будет делаться на сервере.
Название: 2 вопроса
Отправлено: arto от 29 Июня 2003, 18:07:12
Цитировать
Wyclef:
if ($login =~ /[^a-z]+/i) {


улетают так-же цифры.
Название: 2 вопроса
Отправлено: Wyclef от 29 Июня 2003, 22:04:16
Цитировать
Mog.:
а скрипт потихонечку будет дошуршивать, рассылая мыло.

проверено - не будет...
Цитировать
arto:
улетают так-же цифры.

не только...

Yaroslav разберется :)
Название: 2 вопроса
Отправлено: Mog. от 30 Июня 2003, 07:38:03
Цитировать
Wyclef:
проверено - не будет...
мыло слать? Или вообще ничего делать не будет. Ты сам проверял ?
Я это к тому, что у меня после редиректа, скрипт доделывает то , что ему положено. Нормально работает, вобсчем.
Название: 2 вопроса
Отправлено: Phoinix от 30 Июня 2003, 15:03:11
Wyclef
У меня кстати тоже скрипт продолжает спокойно работу после редиректа...
Единственно я ставлю в таких случаях блокировку на запрежение повторного запуска скрипта пока не закончил работу первый...
Название: 2 вопроса
Отправлено: Wyclef от 30 Июня 2003, 15:44:55
Mog.
Например написано (ты это имел ввиду?):
print "Location:[url]http://куда-то\\n\\n[/url]";
&hard_job;

В браузере, у меня пока hard_job не отработает редирект куда-то не происходит... А в консоле при запуске ./script.pl работает как у тебя :) (как хотелось бы)...
Название: 2 вопроса
Отправлено: Mog. от 30 Июня 2003, 15:49:53
Цитировать
Wyclef:
В браузере, у меня пока hard_job не отработает редирект куда-то не происходит
А с чем это связано, собсно? Сервер кэширует выходные данные скрипта? А потом отдает все оптом? Так получается? А почему у одних работает, а у других нет?
Хочу просто разобраться.
Название: 2 вопроса
Отправлено: Yaroslav от 10 Июля 2003, 21:05:14
Цитировать
Wyclef:
Т.е. добавляешь в cron скрипт (отдельный), который непосредственно осуществляет отправку писем и который, в свою очередь, "смотрит" не изменились ли какие-либо параметры (например спец. поле в БД и т.п.) и нужно отправить письма.

А скриптом, где у тебя sub add, ты где нужно (например там где стоит &mail;) эти самые параметры и меняешь и т.д.

...Надеюсь понятно объяснил?

ничего не понятно
Название: 2 вопроса
Отправлено: Wyclef от 11 Июля 2003, 14:49:30
Yaroslav
Для начала, у тебя есть доступ к crontab?
Название: 2 вопроса
Отправлено: Yaroslav от 11 Июля 2003, 15:58:03
Цитировать
Wyclef:
Для начала, у тебя есть доступ к crontab?

посмотрел, пишет что есть :)
но я им пользоватся вообще не умею (и даже не слышал о нем) :(
а средствами Perl это сделать можно?
Название: 2 вопроса
Отправлено: Wyclef от 14 Июля 2003, 09:29:26
Цитировать
посмотрел, пишет что есть

Как реализовать (с крон\'ом):

Допустим адреса юзеров и письма (отправленные и которые нужно отправить) хранятся в БД. У записи в БД, у письма есть поле "sent", которое отражает было письмо уже отправлено или еще нет. Допустим, его значения: 0 (по-умолчанию) - еще не отправлено, 1 (или текущее время) - уже отправлено.

1. Пишешь скрипт (назовем его mail_queue.pl), который обращается к БД, "забирает" список писем у которых sent = 0. Если есть такие письма, забирает список пользователей, которым эти письма нужно отправить и в цикле, каждому из пользователей их отсылает, если нет - просто завершается. После того как он отправит каждое из писем, для него устнавливается sent отличным от нуля (см. выше).

2. Модифицируешь скрипт, отрывок которого ты привел. В функции add реализуешь простое добавление в БД записи, с телом письма, которое позже нужно будет отправить юзерам (поле sent у него устанавливаешь равным 0). Также, в выводе функции вместо print "Ok!"; - можешь написать print "Письмо сохранено. Через несколько минут оно будет отправлено адресатам"; в зависимости от того, с какой периодичностью крон\'ом у тебя будет запускаться скрипт mail_queue.pl.

3. Добавляешь в crontab, например, такую строку (параметры посмотри в man\'e):
#minute    hour    mday    month    wday    command
*/10       *       *       *        *       /local_path/to_script/queue_mail.pl


Т.е. скрипт mail_queue.pl будет запускаться с интервалом в 10 минут, каждый день.

Допустим за 10 минут скрипт queue_mail.pl не успел отправить все письма (полностью отработать), а крон его еще раз запустил, скрипт возьмет те письма, которые еще не отправлены, но которые уже в работе у предыдущего сеанса (возможно даже в данный момент отсылаются) - в итоге он их может 2 раза отправить. Чтобы такого не было используй "lock/unlock tables".

Таким образом, произойдет как бы разделение труда ;) Работа по добавлению писем будет осуществляться пользователем через браузер, а их отправка будет происходить на стороне сервера и никак его не затронет.

В кратце вроде так, если где-то напутал - укажите. ;)

-----

Цитировать
но я им пользоватся вообще не умею

...проще некуда - это типа "планировщик заданий" под unix
man crontab - там все описано и с примерами.

Цитировать
а средствами Perl это сделать можно?

На бесплатном хостинге, где скрипты нельзя было запускать по расписанию, я запускал скрипт вставляя на страницу код рисунка: - его вывод мне был не важен (скрипт запустится и отработает при посещении странцы где расположен этот код, даже если в процессе загрузки "этого рисунка :)" нажать в браузере "Стоп").

На cpan\'e кажется видел модуль - "заменяюший" crontab - позволяет запускать скрипты по времени, без крон\'а.

Удачи!
Название: 2 вопроса
Отправлено: Yaroslav от 14 Июля 2003, 19:50:56
Wyclef  
спасибо тебе огромное за науку.
но ни один из вариантов полностью не подходит((
кстати, я тут вот что попробовал:
написал в этом списке 70 своих ящиков, и отработал скрипт как надо и достаточно быстро (в среднем за 5 сек, но это может быть погрешность на мою связь), из чего получается, что скрипт тормозит только в том случае, когда адрееса в списке неверные...
или я не прав?