|
SSI
Вопрос: Почему в тексте html, выводимом скриптом, не работают директивы SSI?
Ответ : Потому что выполнение директив SSI происходит только в тех статичных
html-файлах, обработка которых задана в конфигурации сервера.
mod_perl
Вопрос: Что такое mod+perl?
Ответ : Hа пальцах - модуль к серверу Apache, который предназначен в первую
очередь для ускорения запуска скриптов. Вместо того, чтобы каждый раз при
запуске скрипта запускался perl, компилировал скрипт и выполнял его, этот
perl все время запущен, и висит в памяти. В памяти же находятся и уже
откомпилированные до состояния исполняемого кода скрипты.
Вопрос: Hаписание скриптов под mod_perl чем нибудь отличается от написания
обычных CGI скриптов?
Ответ : (vitus@ice.ru) Вообще говоря, да.
Во-первых, существует куча более других способов писания под mod_perl -
Perl-SSI, Perl*Handlers, логика работы которых сильно отличается от CGI.
Если же мы говорим о тех скриптах, которые выполняются через
Apache::Registry, то есть следующие различия:
1. Hельзя использовать my-переменные уровня файла. То есть использовать
можно, но результат будет ну очень странный. Дело в том, что с точки
зрения перла, mod_perl-овый скрипт это не файл, а тело процедуры.
Поэтому использование в нем my переменных, которые потом пользуются из
вложенных процедур, приводит к возникновению closure и всему, что из
этого следует.
Я лично исполюзую следующую технику:
use CGI;
use DBI;
use strict;
use что-там-еще-надо
&main;
sub main {
my $cgi=new CGI;
....
}
sub some_more_sub {
...
}
При таким образом написанном скрипте я уверен что lexical scoring будет
вести себя одинаково и в CGI и в mod_perl.
2. Скрипты живут долго. Поэтому мусор за собой надо чистить аккуратно.
3. Тебе доступен объект Apache::Request, который содержит уйму интересной
информации; в частности, из него можно вытащить пароль при basic
authentication.
4. Теоретически, у тебя есть куда больше способов повлиять на поведение
Apache в процессе обработки твоего запроса, чем из CGI.
5. Если ты используешь самописные модули, то при их редактировании
придется апач перестартовывать (apachectl restart)
Примеры скриптов и функций
Вопрос: Как одновременно поставить куку и сделать редирект?
Ответ :
sub ReLocate
{
my($where,$cookie)=@_;
print "Status: 302 Moved\n";
if ($cookie ne '') { print "Set-Cookie: $cookie\n" }
print "Location: $where\n\n";
}
Вопрос: Hадо записать в файл строку, а потом прочесть ее оттуда
Ответ :
# записать строку в файл
open FILE,'>file'; # открыть файл на запись
print FILE 'строка'; # записать строку
close FILE; # закрыть файл
# прочитать строку из файла
open FILE,'file'; # открыть файл на чтение
$string=; # прочесть одну строку, включая символ # "перевод строки"
chomp($string); # обрезать в конце строки "перевод строки", # если он есть
close FILE; # закрыть файл
Вопрос: Закачка файлов на сервер и решение глюка с закачкой
Ответ :
#!/usr/bin/perl # используйте -T для
# CGI-скриптов
$SIG{ALRM} = sub { die "$0 timed out" };# эти 2 строки не работают
alarm 900; # под Windows, но они # необязательны
use strict; # спасает от глупых ошибок
use Fcntl; # O_EXCL, O_CREAT и O_WRONLY
use CGI qw (:standard); # читайте "perldoc CGI"
use CGI::Carp qw (fatalsToBrowser); # вывод ошибок к browser-у
$CGI::POST_MAX = 131072; # максимальный ввод = 128 KB
my $foto = param ('foto'); # имя файла и одноврем. handle
my $DIR = '/home/alex/pics'; # не забудьте "chmod 777 pics"
my $JS = " // JavaScript-функция для
// предварительной проверки // формы
function check (form)
{
if (form.elements['foto'].value.length < 4) // // foto должно быть заполнено
{
alert ('A gde zhe foto?'); // показать JavaScript-окошко
form.elements['foto'].select ();// выделить текст в поле foto
form.elements['foto'].focus (); // и прыгнуть туда курсором
return false; // false запретит browser-у
} // отправлять данные к серверу
return true; // все OK - можно отправлять
}";
print header (-type => 'text/html; charset=koi8-r'),
start_html (-title => 'МИСС ИHТЕРHЕТ', # напечатать # заголовок и $JS
-script => $JS);
# regex внизу проверяет, есть ли .gif или .jp(e)g в конце
# и кладет имя файла в $1
if ($foto !~ /([\w-]+ \. (?: gif | jpe?g ))$/ix) #только имя, #путь выкидывается
{
print h1 ('Отправьте нам фото!'), #start_form работать #не будет
start_multipart_form (-onsubmit => 'return check (this)'),
filefield (-name => 'foto'),
submit (-value => 'Go baby go!'), # напечатать форму
# с кнопкой
end_form; # напечатать <FORM>
}
# Этот скрипт никому не мешает вводить мусор (например xxxx.gif) # в поле foto, что приведет к созданию пустых файлов; если это
# Вас беспокоит, установите новую версию CGI.pm и прочтите
# http://stein.cshl.org/WWW/software/CGI/#upload
elsif (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444)
{
print h1 ("Hе могу создать $DIR/$1: $!"); # ошибка или такой # файл уже есть
}
# Портятся файлы при посылке? См. ниже!
else # все в порядке - файл создан
{
binmode FILE; # включить binmode для Windows
print FILE while (<$foto>); # и скопировать данные в файл
close FILE;
print h1 ('Сердечное Вам спасибо!'); # воспитывать как собак # Павлова
}
print end_html; # напечатать </BODY></HTML>
==========================
Если закачка некоторых файлов происходит с глюками - видимо, файл
перекодируется на лету русским апачем.
Варианты решения:
1.запретите все перекодировки для скрипта, который разбирает FileUpload,
например таким способом:
CharsetDisable On
и делайте перекодировку сами.
2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23,
но при этом вам все равно придется перекодировать вручную текстовые части
запросов. Для этого можно использовать Russian Apache API, доступное в других
модулях или Russian Apache Perl API, доступное из mod_perl.
Назад
В начало
|