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

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]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.

:)

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


(Читать комментарии) -