Forum Webscript.Ru
Программирование => Perl => Тема начата: 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; или сначала напишет а потом будет отправлять?
-
что б логин проверялся на наличие русских букв
if ($login =~ /[^a-z]+/i) {
print "Допустимы только латинские символы!\\n";
}
или сначала напишет, а потом будет отправлять?
В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.
-
Wyclef:
if ($login =~ /[^a-z]+/i) {
print "Допустимы только латинские символы!\\n";
}
спасибо, работает
Wyclef:
В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.
так вот почему он так долго думает....
как решить этот вопрос подскажешь?
-
Yaroslav:
как решить этот вопрос подскажешь?
Можно решить при помощи cron\'a.
Т.е. добавляешь в cron скрипт (отдельный), который непосредственно осуществляет отправку писем и который, в свою очередь, "смотрит" не изменились ли какие-либо параметры (например спец. поле в БД и т.п.) и нужно отправить письма.
А скриптом, где у тебя sub add, ты где нужно (например там где стоит &mail;) эти самые параметры и меняешь и т.д.
...Надеюсь понятно объяснил? :)
-
Wyclef:
В браузере, пока не отправит "ок" не увидишь, в консоле сначала напишет.
Почему ? Если где то в скрипте есть print "Content-type: text/html\\n\\n"; (раньше чем print "ok";) то и в браузере сначала напишет ок, а потом займется отправкой писем.
Wyclef:
Можно решить при помощи cron\'a.
А можно и при помощи print "Location: куда нибудь\\n\\n";
-
Mog.:
Если где то в скрипте есть print "Content-type: text/html\\n\\n";
Mog.:
А можно и при помощи print "Location: куда нибудь\\n\\n";
Не проможет...
Я раньше подобную тему поднимал (только там было про upload). Советовали fork. Грабли примерно те же...
-
2Wyclef
Уверен? Про аплоад я помню, но там другая история. Там был долгий http запрос, потому скрипт не начинал выполнятся до его завершения и fork не имел смысла. Здесь, если чел хочет быстро-быстро увидеть "Ok!", мона сделать location на этот окей, а скрипт потихонечку будет дошуршивать, рассылая мыло. Браузер, ведь, только команды будет слать, а все что будет делаться, будет делаться на сервере.
-
Wyclef:
if ($login =~ /[^a-z]+/i) {
улетают так-же цифры.
-
Mog.:
а скрипт потихонечку будет дошуршивать, рассылая мыло.
проверено - не будет...
arto:
улетают так-же цифры.
не только...
Yaroslav разберется :)
-
Wyclef:
проверено - не будет...
мыло слать? Или вообще ничего делать не будет. Ты сам проверял ?
Я это к тому, что у меня после редиректа, скрипт доделывает то , что ему положено. Нормально работает, вобсчем.
-
Wyclef
У меня кстати тоже скрипт продолжает спокойно работу после редиректа...
Единственно я ставлю в таких случаях блокировку на запрежение повторного запуска скрипта пока не закончил работу первый...
-
Mog.
Например написано (ты это имел ввиду?):
print "Location:[url]http://куда-то\\n\\n[/url]";
&hard_job;
В браузере, у меня пока hard_job не отработает редирект куда-то не происходит... А в консоле при запуске ./script.pl работает как у тебя :) (как хотелось бы)...
-
Wyclef:
В браузере, у меня пока hard_job не отработает редирект куда-то не происходит
А с чем это связано, собсно? Сервер кэширует выходные данные скрипта? А потом отдает все оптом? Так получается? А почему у одних работает, а у других нет?
Хочу просто разобраться.
-
Wyclef:
Т.е. добавляешь в cron скрипт (отдельный), который непосредственно осуществляет отправку писем и который, в свою очередь, "смотрит" не изменились ли какие-либо параметры (например спец. поле в БД и т.п.) и нужно отправить письма.
А скриптом, где у тебя sub add, ты где нужно (например там где стоит &mail;) эти самые параметры и меняешь и т.д.
...Надеюсь понятно объяснил?
ничего не понятно
-
Yaroslav
Для начала, у тебя есть доступ к crontab?
-
Wyclef:
Для начала, у тебя есть доступ к crontab?
посмотрел, пишет что есть :)
но я им пользоватся вообще не умею (и даже не слышал о нем) :(
а средствами Perl это сделать можно?
-
посмотрел, пишет что есть
Как реализовать (с крон\'ом):
Допустим адреса юзеров и письма (отправленные и которые нужно отправить) хранятся в БД. У записи в БД, у письма есть поле "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 - позволяет запускать скрипты по времени, без крон\'а.
Удачи!
-
Wyclef
спасибо тебе огромное за науку.
но ни один из вариантов полностью не подходит((
кстати, я тут вот что попробовал:
написал в этом списке 70 своих ящиков, и отработал скрипт как надо и достаточно быстро (в среднем за 5 сек, но это может быть погрешность на мою связь), из чего получается, что скрипт тормозит только в том случае, когда адрееса в списке неверные...
или я не прав?