Xpoint
   [напомнить пароль]

Perl & CGI, общие вопросы

Метки: [без меток]
[удл]
2008-04-03 22:36:30 [обр] MRTA[досье]

Здравствуйте, уважаемые. Пытаюсь поднять свой уровень в CGI-программинге, накапливаются вопросы, на которых ни книги, ни гугл ответа не дает. Они носят больше познавательный характер, но мне бы хотелось услышать и на них ответы.

  1. Пишу под Windows, xampp + Active Perl. Автоматически первую строку, строку спец. комментария, пишу как #!/usr/bin/perl. Кидаю файл в cgi-bin, - вылетает Internal Error. Изменяю первую строку на действительный путь к интерпретатору, и все ок. Подскажите, уважаемые, в *nix-based системах тоже надо указывать точный путь, если запускаешь скрипт через CGI?
  1. При создании скриптов я использую приличное кол-во модулей. Пробовали запускать на других Win-машинах, и выяснялось что некоторых частенько не хватает. Можно ли сделать проверку и вывод информации о том, каких модулей не хватает, в удобочитаемом формате с корректным завершением программы? Допустим : "Cand find module Thread" и все.
  1. Интересный момент. Есть скрипт, который лежит в cgi-bin. Простая формочка, которая после заполнения отсылает определенную информацию через HTTP (Get). Хотел укрепить свои знания в плане многопоточности, реализовав все это через Thread. Кусок программы.

.......

$kolvopotokov = 2; #количество потоков

###Создаем 2 потока###

for(my $schet=0;$schet<=$kolvopotokov;$schet++)
{
    $threads[$schet]=Thread->new(\&start);
}
foreach my $thr(@threads)
{
$thr->join();
}

####Основная подпрограмма, отправляет задания.

sub start {

open (STDOUT, ">" , "123.txt") or die "cant open"; #С этой строкой творится что-то мистическое

$request = HTTP::Request -> new(GET => "http://localhost/cgi-bin/hello.pl");
$answer=$ua->request($request);
print "$answer->code()";

               }

Ну так вот. Самое интересное. Вижу в access.log апача обращение к этому файлу, но в 123.txt - пусто. Если все реализовывать не через потоки, то в 123.txt записывается код ответа. Пробовал перенаправлять STDOUT вне подпрограммы start, до цикла создания потоков. Все равно код ответа не записывается. Вообще любой принт в start не пишется в файл. Что я упустил в этой жизни? =)

  1. И, последнее на сегодня. Есть ли где-нибудь информация о том, какие модули идут в стандартной поставке Perl, если вообще идут?

Заранее благодарю и извиняюсь, если слишком много вопросов в одной теме. Не хочется бегать между ими 4-мя, поэтому я решил рискнуть =).

спустя 1 час 57 минут [обр] mita4ok[досье]
  1. да, обычно путь и есть /usr/bin/perl и соответственно #!/usr/bin/perl, иногда бывает

можно в юниксах поискть перл командой в шелле:

which perl

чтобы не получить в юникс Internal Error, наде еще права на скрипт установить, хотя бы rwx--x--x

  1. В модуль CGI входит CGI::Carp

напишите в вашем скрипте
use CGI::Carp qw(fatalsToBrowser);
получите ошибки в браузер, в том числе и те, где говорится о том что не хватает какого-либо модуля

  1. close?
  1. для примера http://search.cpan.org/~rgarcia/perl-5.10.0/
спустя 16 минут [обр] mita4ok[досье]
  1. бррр, а почему STDOUT?

open (FH, ">>" , "123.txt") or die "cant open";
...
print FH $answer->code();
close(FH);

насчет >>
определитесь что вы хотите делать:
каждый раз перезаписывать файл (>)
или дополнять (>>)

спустя 44 минуты [обр] Алексей Севрюков(198/1280)[досье]
М Перенесено из форума "Программирование::Perl::Разное"
спустя 37 минут [обр] MRTA[досье]
  1. Спасибо. Про which perl я знаю, но, к примеру, если это виртуальный хостинг без ssh-доступа, то указав другой путь скрипт не запустится через CGI? Нужно спрашивать у тех. поддержки хостера путь? Есть ли возможность указать, к примеру, несколько путей сразу?
  1. Спасибо. Попробую изложить мысль немного не в то направление. Допустим у меня есть тот же самый виртуальный хостинг без возможности устанавливать модули. Как решается вопрос в данном случае? Опять разговоры с тех. поддержкой? Или какими-либо средствами имеется возможность подключить эти модули в обход установки?
Смотрите, допустим на сервере нет даже модуля CGI. Скрипт просто кидается в папку cgi-bin, мы его открываем в браузере (естественно Internal) и получаем на выходе файл (допустим otchet.txt), каких модулей не хватает. Что-то типа подпрограммы проверки наличия используемых модулей в системе. Возможно ли такое написать?
Ну и собсно вопрос который был выше. Можно ли заставить неустановленные модули работать без тех. поддержки?
  1. Спасибо. вопрос решился). Переписал все по другому =).
  1. Спасибо. Вопрос закрыт.
спустя 7 часов [обр] Михаил(0/17)[досье]
  1. Несколько путей указать нельзя. У вирт-хоста как правило /usr/bin/perl, если нет, то думаю стоит подуать о смене хоста, ибо это стандартный путь, и не есть хорошо, со стороны хостера, заставлять менять у пользователей "общепризнанные" пути.
  2. Когда то давно писал у себя в дневнике, чтобы самому незабыть, правдо уже даано не пользую, но вам думаю самое оно :-)
http://www.liveinternet.ru/users/pegas-s/post66206230/
спустя 8 дней [обр] MRTA[досье]

Благодарю Михаил. Надо будет проверить все на практике, очень поможет в будущем.

Тему можно удалять, все поставленные вопросы решены.

Powered by POEM™ Engine Copyright © 2002-2005