Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет rusec ([info]rusec)
@ 2007-11-20 13:43:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Perl vs PHP
Думается, подавляющее большинство программистов, знающих и perl и php со мной согласится.
При общей похожести perl более продуман и писать на нём приятней.
Но.
Подавляющее число вебпроектов пишется на php.
Я, собственно, за него и взялся не найдя ни одной приличной CMS на перле.
Кажется, я понял в чём дело.
Пых работает быстрее, меньше процессор грузит.
Написал простенький тестик:

Perl:

#!/usr/bin/perl

$| = 1;
$\="\n";

use librusec;
use Encode;
use bytes;
use Net::HTTP;

print "Content-type: text/html; charset=utf-8\n\n";

for ($i=0;$i<22;$i++) {
$b = $i*22+33;
$tit = Select("Title FROM libbook WHERE BookId = $b");
$booktit{$b} = $tit;
$bookid{$tit} = $b;
}

foreach $b (keys %booktit) {
$r .= ',' if $r;
$r .= $booktit{$b};
}
print $r;


PHP:


$libmode = 1;
require 'AJAX.php';
set_active('lib');
for ($i=0;$i<22;$i++) {
$b = $i*22+33;
$tit = Sel("Title FROM libbook WHERE BookId = $b");
$booktit{$b} = $tit;
$bookid{$tit} = $b;
}

foreach ($booktit as $t => $b) {
if ($r) $r .= ',';
$r .= $b;
}

print $r;


Вызов:

#!/usr/bin/perl
use Time::HiRes;
use Net::HTTP;

$| = 1;
$\="\n";


for $i (0..99) {
$t1 = Time::HiRes::time();
$type = $i%2 ? 'php':'pl';
my $host = Net::HTTP->new(Host => 'localhost') or die $@;
$host->write_request(GET => 'speed.'.$type, 'User-Agent' => "Mozilla/5.0");
my($code, $mess, %h) = $host->read_response_headers;
my $buf;
my $n = $host->read_entity_body($buf, 1024);
die "read failed: $!" unless defined $n;
$t2 = Time::HiRes::time() - $t1;
$sum{$type} += $t2;
}

print "PHP: $sum{php}, Perl: $sum{pl}";


Запустил несколько раз, чтоб мускульные кэши заполнились.

Результат:


PHP: 0.42498517036438, Perl: 9.19204187393188
PHP: 0.35810399055481, Perl: 10.2584187984467
PHP: 1.05701279640198, Perl: 9.79568386077881
PHP: 0.555223226547241, Perl: 10.5315308570862
PHP: 0.296421051025391, Perl: 16.945974111557
PHP: 0.327699899673462, Perl: 11.2998297214508

Разница заметна

Думаю, причина в том, что перлу надо обрабатывать use (которых в реальной жизни заметно больше, чем в тесте), а за пых это делает APC.
А может еще в чём.


(Добавить комментарий)


[info]_slw@lj
2007-11-20 16:08 (ссылка)
теперь осваивай mod_perl

(Ответить) (Ветвь дискуссии)


[info]rusec@lj
2007-11-20 16:20 (ссылка)
Зачем?
Не буду же я друпал на перле переписывать.
Интересно найти машинку с mod_perl и APC - и сравнить.

(Ответить) (Уровень выше)


[info]m3chman@lj
2007-11-20 18:11 (ссылка)
cms на перле: movable type 4 ? :)

(Ответить) (Ветвь дискуссии)


[info]rusec@lj
2007-11-20 19:23 (ссылка)
и еще парочка.
Из серьёзного - только ЖЖ, но мне он как-то никак.

(Ответить) (Уровень выше)


[info]shaplov@lj
2007-11-20 18:40 (ссылка)
Если ты хочешь сравнивать производительность для web-применения, то следует использовать mod_perl и то через что php пускается в апаче.
Есть версия, что результаты могут сильно отличаться.

(Ответить) (Ветвь дискуссии)


[info]rusec@lj
2007-11-20 18:53 (ссылка)
как его поставить?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]shaplov@lj
2007-11-20 19:02 (ссылка)
apt-get install apache-perl
:-/
Ну или под чем ты там живешь...
Это уже вопрос дистрибутива...
Фокус в том, что модперл кеширует pm'ки которые подключаются, и по второму разу на use тратиться гораздо меньше времени... И не только pm'ки, а вообще весь перловый код.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]rusec@lj
2007-11-20 19:13 (ссылка)
Я добавил в httpd.cfg строчку LoadModule perl_module modules/mod_perl.so
запустил /etc/init.d/httpd configtest
оно мне говорит - [Tue Nov 20 14:02:34 2007] [warn] module perl_module is already loaded, skipping
Так что видать был уже мод_перл. Может, без него еще хуже? Или его где включить/настроить надо?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]jamhed@lj
2007-11-20 22:25 (ссылка)
В логах апача должно быть (error_log):
mod_perl/1.24 configured -- resuming normal operations

Потом Ваш скрипт надо вызывать не через CGI, а специальным образом:


Alias /perl/ /home/stas/modperl/

PerlModule Apache::Registry
[Error: Irreparable invalid markup ('<location /perl/>') in entry. Owner must fix manually. Raw contents below.]

В логах апача должно быть (error_log):
mod_perl/1.24 configured -- resuming normal operations

Потом Ваш скрипт надо вызывать не через CGI, а специальным образом:


Alias /perl/ /home/stas/modperl/

PerlModule Apache::Registry
<Location /perl/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
PerlSendHeader On
allow from all
</Location>

Apache::Registry отвечает за то, что Ваш скрипт будет скомпилирован и загружен в mod_perl, для последующих исполнений без компиляции.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]rusec@lj
2007-11-21 00:07 (ссылка)
Как всё не просто.
В логах апача есть, в конфигах ничего похожего.
Я понял.
Пых популярен потому что его настраивать не надо.
А тут такие сложности.

Как это должно по минимуму выглядеть, что вписать в .htaccess, чтоб папка pl/ обрабатывалась правильно?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]jamhed@lj
2007-11-21 00:18 (ссылка)
Ну видимо надо в .htaccess написать:

PerlModule Apache::Registry
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On

Это на самом деле не сложности. Сложности в идеологии.
Perl предполагает, что будет писаться приложение, работающее на уровне Apache.
Apache::Registry и Apache::PerlRun - это костыли.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]rusec@lj
2007-11-21 14:04 (ссылка)
говорит Can't locate Apache/Registry.pm in @INC
и не работает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]jamhed@lj
2007-11-22 05:07 (ссылка)
Simply change Apache::Registry to ModPerl::Registry in both httpd.conf and preload.perl.
Note: This is a known issue with mod_perl2 and apache2.

:)

(Ответить) (Уровень выше)


[info]reitetsu@lj
2007-11-21 13:23 (ссылка)
Сравнение некорректное, нужно использовать mod_perl или FastCGI. Без этого надо каждый раз ждать запуска интерпретатора.

Причина более высокой распространённости похапе, скорее всего, в гораздо более пологой кривой обучения. Сколько надо выучить перла, чтобы сделать простейшую динамическую страницу?

(Ответить) (Ветвь дискуссии)


[info]rusec@lj
2007-11-21 13:56 (ссылка)
Ровно столько же.
Синтаксис очень похож.
А три строчки в начале

#!/usr/bin/perl
use CGI;
print "content-type:text/html\n\n";

никто не учит, а копирует из примеров.

Для того, чтобы сделать простейшую динамическую страницу, надо знать:
1. html (и CSS хоть как-то)
2. sql
3. неплохо бы javascript
на этом фоне отличия сложности изучения перла от пыха совсем слаборазличимы, если они и есть.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]grey3@lj
2007-11-22 09:17 (ссылка)
Различия есть, по мере копания вглубь их всё больше.
Перл является универсальным, Пыхп возник специально для Веба и оптимизирован для него. Мод-перл - не столько оптимизация Перла под Веб, сколько оптимизация под Апач; основное отличие - интерпретатор не стартует заново, а лишь повторно исполняет скрипт. Отсюда в мод-перле намного более жёсткие требования к качеству скриптов: обязательна явная инициализация-очистка переменных перед использованием, пограммист не должен допускать "утечек" памяти (в особенности неудаления или потери структур, имеющих ссылки на самих себя - обычный сбор мусора их не ловит и не освобождает!), обязательно use strict, ну и прочие мелочи. Иначе возникает самая частая ошибка - скрипт использует часть переменных со значениями, оставленными после запроса предыдущего юзверя! Во втором случае быстро растёт размер процессов и начинается своппинг, а при ограничении "maxReqPerChild" теряется преимущество мод-перла в отсутствии повторных стартов интерпретатора. Поэтому в большинстве случаев скрипты, написанные на Перле, для мод-перла приходится внимательно отлаживать и немного править. Я сам когда-то этим занимался.
Все эти сложности и привели к быстрой победе Пыхпа над Мод-перлом в области Веб-дизайна.
Другое дело, что изредка возможностей Пыхпа не хватает для особо сложной обработки данных, и тогда удобнее программировать в мод-перле; но это именно единичные случаи. Для готовой системы не стоит стараться и изучать тонкости мод-перла.

(Ответить) (Уровень выше)


[info]ni_ten_ichi_ryu@lj
2007-12-24 13:48 (ссылка)
некорректный тест. есть такие вещи, как mod_perl и fastcgi.

(Ответить) (Ветвь дискуссии)


[info]rusec@lj
2008-05-04 07:45 (ссылка)
Есть.
Только завести его мне не удалось.
И скрипты под mod_perl надо писать специальным образом.
А с пыхом - yum install apc и всё летает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ni_ten_ichi_ryu@lj
2008-05-05 13:57 (ссылка)
ну вот так бы и говорили :)
в любом случае, это неважно.

(Ответить) (Уровень выше)