Автор Тема: Mod perl в IkonBoard 302  (Прочитано 4873 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vladn

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://mod-site.net/ru/
Mod perl в IkonBoard 302
« : 10 Января 2004, 16:13:10 »
в файле ikonboard.cgi есть такие строчки:
require Boardinfo;
...
require Lib::FUNC;
require Sessions;
require iDatabase::SQL;

То есть там полно require, в том числе и через eval. Как будет себя вести mod_perl, втретив require? Запустит ли он компилятор или найдет скомпилированный код для подключаемого модуля? И вообще, переваривает ли mod_perl require? Ведь на странице http://www.hosting.zenon.net/documentation/v-www/0026.html написано:

Цитировать
При миграции на mod_perl необходимо учитывать, что переносимый скрипт должен соответствовать некоторым требованиям. В скрипте не должны использоваться:
директива require, так как Вы не сможете получить доступ к переменным и процедурам требуемого модуля,
директивы _DATA_ и _END_,
функция exit(). Вместо нее используется Apache::exit()

Объясните мне, пожалуйста. Я переделываю гостевушки под mod_perl и у меня полно require.
 - мои гостевушки MBook

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #1 : 12 Января 2004, 10:58:53 »
Документация извращена до безобразия! Вероятнее всего написанна с учетом пожеланий хостера.

Зайди на родную страничку http://perl.apache.org или вот очень здоровский сайт http://www.take23.org.

В основной массе изменения касаются стартового скрипта. Если использовать PerlRun вместо Registry, их еще меньше. Пользуйся require как и пользовался раньше. Директивы __DATA__, __END_ и пр. нельзя использовать, опять же, лишь в стартовом скрипте.

Советы:
- Если хочешь перевести свои cgi\'шные скрипы под mod_perl используй PerlRun, Отличий немного, вот навскидку: больше не существует стартового скипра под именем main, имя у него теперь побольше(сильно больше) ;), про процедуру END{ } забудь, модули раз предкомпилируются и далее не перегружаюся, даже при изменении (эта проблема легко решается, чти маны). Вроде все если ничего не забыл.
- Если решишься на Registry осторожнее с памятью, perl назад ничего не отдает ;) Да и переменные ведут себя несколько иначе :)
- Решаться на Registry большого смысла нет, если у тебя стартовый скрипт небольшого размера.
- Можно поступить следующим образом, все помещаешь в модули, а стартовый скрипт выгрядит примерно так:
#!/usr/bin/perl
require Something;
--------
ну как из примера понятно, стартовый скипт целиком перекочевал в модуль Something.pm
Данная конструкция работает и под mod_cgi и под mod_perl(в любом исполнении) ;)
« Последнее редактирование: 13 Января 2004, 15:26:14 от ondr »
0 OK, 0:1

Оффлайн Vladn

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://mod-site.net/ru/
Mod perl в IkonBoard 302
« Ответ #2 : 13 Января 2004, 12:10:17 »
Спасибо за столь обширный ответ. Я только начал знакомство с mod_perl, поэтому и возникют вопросы. Сейчас читаю книжку http://perl.apache.org/docs/1.0/guide/guide.pdf.
Цитировать
Пользуйся require как и пользовался раньше.

Я думаю (может быть неправильно), что если я буду пользоваться require в том же объеме, что и пользовался ранее, то все преимущества mod_perl сойдут на "нет". Ведь тогда апачу придестся загружать компилятор, компилировать текст, который я подключил по require. Как я понимаю, основное преимущество mod_perl заключается именно в том, что удается избежать стадии компиляции.

Я пробовал использовать require в mod_perl - получается какая-то ерунда. Во первых, что-то произошло с указателем на текущую дерикторию: \'./\' и \'../\' теперь не работают, приходится указывать абсолютный путь. Причем require \'module.cgi\' еще проходит, а use module уже нет (с учетом, что module.cgi и module.pm находятся в той же дериктории). Приходится говорить use lib (\'текущая директория\'). Потом написал простенький скрипт с require:
файл mod2.cgi
print "Content-type: text/plain\\n\\nBegin\\n";
require \'mmm.cgi\';

файл mmm.cgi
print "AAAAAAAAAAAAAAAAAAAAAAAA";

Выдается только Begin. В других экспериментах при первом обращении к скрипту было видно, что необходимый файл подключается, а при повторных обращениях файл уже не подключался.
Может быть, проблема в том, что я подключаю чистый текст, а не модуль.
Цитировать
Если хочешь перевести свои cgi\'шные скрипы под mod_perl используй PerlRun

Насколько я понимаю, PerlRun не такой быстрый как Registry. В указанной книжке написано: "Apache::PerlRun is usually useful in the transition period, while the scripts are being cleaned up to run properly under Apache::Registry. Though it gives you a significant speedup over mod_cgi, it\'s still not as fast as Apache::Registry and mod_perl handlers."
Как говорится в одном известном мультике "Лучше день потерять, потом за пять минуть долететь". Поэтому я лучше помучаюсь с Registry, зато потом скрипты будут летать.
 - мои гостевушки MBook

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #3 : 13 Января 2004, 13:16:56 »
1. Тебе во первых нужно научится пользоваться require и use и, что важнее понять как они работают.

require \'blabla.cgi\' - больше не пользуйся этим.
в место этого позуйся класическим представлением модуля

К примеру выберем директорию /PM относительно корня сайта, куда будем класть все модули

blablabla.pm - обзываем все модули с расширением .pm
----
package PM::blablabla; # Данная директива выделяет нам чистую таблицу переменных, это гарантирут, что переменные у нас никогда не пересекуться. PM::blablabla - это внутреннее представление perl\'а о путе до модуля, соответствует PM/blablabla.pm в реале.

...
...
...


1;  # Последняя строка должна выглядеть так, ибо require хочет, чтоб модуль всегда возвращал истинный результат

---

Теперь о подключении модуля:
-----
# Perl ищет модули в путях, записанных в массиве @INC, поправим его

BEGIN { unshift @INC, $ENV{DOCUMENT_ROOT} }
# use lib $ENV{DOCUMENT_ROOT} - тоже самое

# теперь  чтобы подключить его нужно воспользоваться require или use
# use PM::blablabla @params - это примерно тоже самое что и BEGIN { require PM::blablabla; import PM::blablabla @params }

use PM::blablabla;

---
Почитай документацию по этим директивам + perldoc Exporter;

2.
Цитировать
что если я буду пользоваться require в том же объеме, что и пользовался ранее, то все преимущества mod_perl сойдут на "нет"

Это не так.

3. Registry предкомпилирует все, PerlRun все кроме стартового скрипта и обнуляет переменные при выходе. На практике между PerlRun и Registry разница почти незаметна при небольшом стартовом скрипте. Но проблем существенно меньше. Плюсы минусы я описал. Решать тебе.

зы: Преимущество mod_perl еще и в том, что с ним не порождается новый процесс каждый раз когда запускается скрипт как при mod_cgi
« Последнее редактирование: 13 Января 2004, 13:27:43 от ondr »
0 OK, 0:1

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #4 : 13 Января 2004, 15:37:52 »
В догонку:

Под mod_perl предпочтительнее пользоваться PerlSetEnv PERL5LIB в конфиге апача вместо use lib. Узнать что скрипт запущен под mod_perl можно по значению $ENV{MOD_PERL}



ps: И я немного ошибся в первом сообщении. Так как я описал, скрипт выполниться лишь 1 раз. Правильнее будет так:

#!/usr/bin/perl
require Something;

Something::process(); # Где process() - функция в которую помещен весь код (все кроме подключения других модулей). Предкомпилируется она один раз, но пользоваться можно сколько угодно раз.
0 OK, 0:1

Оффлайн Vladn

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://mod-site.net/ru/
Mod perl в IkonBoard 302
« Ответ #5 : 13 Января 2004, 23:35:31 »
Спасибо за ликбез.
Моя проблема в том, что я изучал перл не по книжкам, а по произведениям искусства российских программеров. А там были сплошные require. Причем подключались не модули, а голый текст. Вот теперь переучиваюсь.
Выбор между Registry и PerlRun я сделаю после прочтения руководства по mod_perl.


Я тут слежу за своим конкурентом borda.ru. Он раньше писал, что перешел на mod_perl. Теперь хвалится тем, что его скрипты используют FastCGI. Нельзя ли в двух словах рассказать о том, чем принципиально отличается FastCGI от mod_perl и как соотносятся их скоростные характеристики?
 - мои гостевушки MBook

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #6 : 14 Января 2004, 11:20:11 »
Цитировать
Моя проблема в том, что я изучал перл не по книжкам, а по произведениям искусства российских программеров.

Попробуй CPAN\'овские произведения. Многие(но не все) очень интересно написаны и есть чему поучиться.


FastCGI не пользуюсь и не пользовался, когда то читал, про это, но уже не помню что. Жди, может кто нибудь и ответит.
0 OK, 0:1

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #7 : 14 Января 2004, 11:50:10 »
Я его пользую. Смысл FastCGI заключается в том что скрипт стартует как сервис и поднимается в память. Компилится только один раз при запуске Apache. Работать с ним очень просто но и неприятностей с ним тоже есть немало. Насчет скоростных характеристик - гугль тебе поможет.
ЗЫ. Я сейчас более склоняюсь к использованию mod_perl, но это субьективно.
The documentations is your friend

Оффлайн Vladn

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://mod-site.net/ru/
Mod perl в IkonBoard 302
« Ответ #8 : 14 Января 2004, 21:41:32 »
А насколько активно поддерживают хостинг-провайдеры технологии mod_perl и FastCGI и какой из них отдают большее предпочтение?
 - мои гостевушки MBook

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #9 : 15 Января 2004, 10:16:41 »
Под mod_perl нужен не менее чем виртуальный выделенный(полувыделенный) сервер.
0 OK, 0:1

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Mod perl в IkonBoard 302
« Ответ #10 : 15 Января 2004, 11:06:58 »
ondr под fastcgi тоже самое. А точнее доступ к конфигам апача.
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28