Встроенному perl'у быть!

    Однажды холодной сибирской зимой начальство решило согреть нашу команду горячей начальственной любовью и передало в наши руки еще один проект. С первого же взгляда обнаружилось несколько серьёзных проблем:
    • Это было написано на PHP;
    • Это было написано на таком PHP, что **** **** ***;
    • Захардкожено было всё, и ни о какой расширяемости или настраиваемости речи не шло. А ведь нагрузка росла не по дням.

    В общем, как настоящие русские парни, мы решили все сломать к хренам собачьим и построить заново, сделав красиво. Почесав репу решили, что apache+modperl — это для старпёров и не интересно, а fastcgi — путь слабых духом, поэтому все будем делать на nginx + его вечноэкспериментальный встроенный перл.

    Позже я почувствовал себя на густозасеянном разного размера глаблями поле…


    Путь джедая

    Буквально с первой же строчкой кода начались и первые проблемы. Начнем с того, что многие всеми любимые перловые модули были заточены под Apache и под nginx работать отказывались сколько их не уговаривай. Плюс ко всему форумы пестрили заголовками вроде «nginx+perl+mason — это невозможно», которые сразу насторожили. Как оказалось зря! mason завелся с полпинка и работал отлично, но это потом.

    Модули затачивать под nginx жутко не хотелось(см. замечание про русских парней выше), поэтому было решено и их написать самим. Повыкидывав все
    ненужное, мы поняли, что не хватает одного лишь Apache::Session, который как видно из имени, работает с сессиями только под вражескими серверами. Хранилище сессий с таким же как и у Apache::Session интерфейсом было написано за вечер и счастье казалось таким близким.

    На следующее утро решил начать то о чем, собственно, топик — завод встроенного в nginx перла. Тут-то и началось веселье.

    Мануал nginx говорит, что все довольно просто. Надо в конфиг вставить
            http {
                    perl_modules  habrahabr/lib;
                    perl_require  handler.pl;
                    server {
                            location / {
                                    perl habrahabr::webhandler;
                            }
                    }
            }
    


    И написать сам хендлер

    package habrahabr;
    use nginx;
    sub webhandler {
            my $r = shift;
            $r->send_http_header("text/html");
            return OK if $r->header_only;
            $r->print("hello habrahabr!\n<br/>");
            return OK;
    }
    1;


    Немного помусолив пути в конфиге, этот пример удалось запустить. Дальше заводим mason. Тут получили удар куда надо первыми граблями: обычно mason делают через HTML::Mason::ApacheHandler, который делает программисту хорошо. У нас этого не было, поэтому пришлось лезть в кишки mason'a и использовать HTML::Mason::Interp напрямую. Но он по умолчанию плюёт весь вывод в stdout, а нам надо через $r->print(). Покурив маны
    увидели у конструктора HTML::Mason::Interp параметр out_method. Грабли появились вот какие: mason — довольно тяжелая штука и создавать его при каждом запросе страницы не комильфо, посему делаем один объект мейсона при инициализации(тут тоже грабельки, но об этом позже) и используем его потом при обработке всех запросов, но тогда придется сделать и $r глобальным!
    Получилось как-то так:

    our $r;
    our $mason;

    $mason = new HTML::Mason::Interp(
                                    ...
                                    out_method => sub { $r->print(@_) },
                                    ...
    );

    sub webhandler {
            $r = shift;
            ...
            $mason->exec($r->uri);
    }


    Сразу же после этого выяснилось, что nginx не умеет передавать параметры из URL в переменные, а передаёт только сам URL — делай с ним всё, что тебе захочется. Ну ладно, подумал я, не велика потеря. URL распарсили, аккуратно все положили в переменные и поехали дальше.

    В скором времени, конечно же, понадобилось использовать не GET, а POST запросы, а они в nginx обрабатываются совсем замечательно. Судя по мануалам, если приходит POST запрос, то его можно обработать, установив обработчик через $r->has_request_body(handler_ref).
    Первый обработчик был такой:
    sub HandlePOST {
            my $body = $r->request_body;
            ...
            DoRequest();
            return OK; # В манах как-то скудно написано об этой функции,
                       # но можно понять, что назад в webhandler мы не вернемся, поэтому ретурним OK отсюда
    }


    Но после недолгого чтения самизнаетечего, это быстро заменилось на
    sub HandlePOST {
            my $body = $r->request_body;
            unless ( $body ) {
                    my $file = $r->request_body_file;
                    if ( $file && -f $file ) {
                            my ($fh, $block);
                            open $fh, "<$file";
                            binmode $fh; # на всякий случай
                            while ( read $fh, $block, 4096 ) { $body .= $block }
                            close $fh;
                    }
            }
            ...
            DoRequest();
    }


    Работало на ура… на пустой странице без передачи параметров и так далее. Чуть что — сразу в логе появлялось красивое worker process exited on signal 11. Вычитка манов не помогала. Дебагом было установлено, что падаем мы всегда по-разному — иногда при вызове $r->request_body, иногда при $r->request_body_file, иногда уже в DoRequest, а иногда уже после DoRequest. Через два дня(!!!) со слезами на глазах я в тысячный раз открыл мануал, глаз вцепился в одну единственную строчку, сердце забилось со страшной силой, а губы беззвучно повторяли все непечатные заклинания, которые мне только известны.

    Все оказалось как всегда очень просто: когда мы в webhandler делаем $r = shift; ни в коем случае не стоит в других местах работать с этим же объектом! в HandlePOST тоже передается объект запроса, который может быть уже совсем не таким, как наш глобальный. Ну и получается классический такой сегфолт.

    После добавления в самое начало HandlePOST строчки $r = shift; все отлично заработало без проблем.

    Почти в самом конце пришлось немного повозиться с загрузкой файлов. Поскольку CGI мы не использовали, пришлось читать всякие там гуглы, в хэндлере понимать, что нам пришел файл, и что-нибудь с ним делать. По долгу службы RFC822, RFC2822, RFC2046-2049 давно прочитаны и выучены наизусть, поэтому мне сразу стало понятно, что файлы-то приходят как обычный MIME part. Парсить его руками я не рискнул, поэтому попробовал распарсить через MIME::Parser. Распарсила, зараза!

    Еще одна особенность, о которой я обещал написать, но не нашел подходящего места:
    При старте nginx запускает перл и грузит наш файл с обработчиком. Этот файл перлом честно выполняется(то есть проходят все use, require, выполняется непроцедурный код и так далее). Вроде ничего страшного, кроме того, что все это счастье делается из под root'а =). В общем-то, с mason'ом тут и возникла основная проблема: у него есть свой кэш, чтобы каждый раз не перекомпилировать шаблоны. Путь к кэшу указывается в конструкторе, но этот путь не полный и mason внутри него создает еще кучку служебных папок и файлов. Далее, когда приходит запрос от клиента, webhandler выполняется уже с правами, данными ему админом(то есть nginx:nginx), и записать в кэш скомпилированные шаблоны не может, ибо созданы папки были рутом.

    Выхода виделось два: либо при создании объекта мейсона делать chmod-ы папок на обычного пользователя, либо создавать объект мейсона уже в webahndler(чего изначально очень хотелось избежать).
    Из двух зол я выбрал второе и чуть ниже станет ясно как это было реализовано.

    Через несколько недель был запуск и было все хорошо, а первый миллион удачных ответов nginx'a(без ездиного разрыва) были восприняты мною как полная победа. Добро победило!

    В конце хотелось бы сказать, что маны читать полезно(особенно, если они на родном языке), но не всегда там видистя сразу то, что нужно. Ну и приведу скелет обработчика nginx с использованием mason и с обходом всех встретившихся мне граблей:

    package Habrahabr;
    use strict;
    use warnings;
    use nginx;
    use HTML::Mason;

    # our - это старая привычка, тут уже можно без него
    our $request;
    our $mason;
    our $init = 0;
    sub WebHandler {
            $request = shift;
            if ( !$init || !$mason ) {
                    $mason = new HTML::Mason::Interp(
                                            comp_root => "/opt/habrahabr/html",
                                            data_dir => "/opt/habrahabr/var/mason_cache/",
                                            use_strict => 1,
                                            out_method => sub { $request->print(@_) },
                                            error_format => 'html',
                                            error_mode => 'output',
                                            allow_globals => [ qw( $request %session $uri $post_param ) ], # это чтобы потом из шаблонов можно было использовать переменную запроса
                    );
            }
            # чистим остатки от прошлого запроса
            $mason->set_global( uri => '' );
            $mason->set_global( post_param => '' );
            if ( $r->request_method eq 'POST' ) {
                    $request->has_request_body( \&Habrahabr::ProcessPOST );
                    # сюда мы больше не вернёмся!
            }
            elsif ( $r->request_method eq 'GET' ) {
                    DoRequest();
            }
            else {
                    return DECLINED;
            }
            return HTTP_OK;
    }
    sub ProcessPOST {
            $request = shift; # теперь нужно использовать этот и только этот объект
            # вытаскиваем post параметры
            my $body = $r->request_body;
            unless ( $body ) {
                    my $file = $r->request_body_file;
                    if ( $file && -f $file ) {
                            my ($fh, $block);
                            open $fh, "<$file";
                            binmode $fh;
                            while ( read $fh, $block, 4096 ) { $body .= $block };
                            close $fh;
                    }
            }
            # получить файлы
            my $ContentType = $r->header_in('Content-type');
            if ( $ContentType =~ 'multipart/form-data' ) {
                    my ($Boundary) = ( $ContentType =~ /boundary="?([^\s]+)"?/ );
                    # дописываем заголовок, чтобы парсер понял, что перед ним MIME и можно его парсить
                    $body = "Content-Type: multipart/form-data;\n boundary=\"$Boundary\"\n\n".$body;
                    my $Parser = new MIME::Parser;
                    $Parser->output_to_core(1);
                    $Parser->decode_bodies(0);
                    # парсер умирает страшно. А работать дальше надо. в eval его, в eval!
                    eval {
                            $body = $Parser->parse_data( $body );
                    };
            }

            $mason->set_global( post_param => \$body );
            DoRequest();
    }
    sub DoRequest {
            my $uri = $request->uri;
            # Имитируем DirectoryIndex. Как сделать это из nginx'a мы так и не придумали.
            if ( !$mason->comp_exists( $uri ) ) {
                    if ( $mason->comp_exists( $uri . "/index.html" ) ) {
                            $uri = $uri . "/index.html";
                    }
                    else {
                            $uri = "/404.html"; # не забыть там отдать 404, а не 200
                    }
            }
            $mason->set_global( request => $request );
            $mason->set_global( uri => $uri );
            $mason->exec( $uri );
    }


    Надеюсь, что я трудился не зря, и этот топик поможет хоть кому-то. Удачи =)

    _________
    Текст подготовлен в VIM. Код раскрашен GNU Source Highlight


    UPD: Я ничего не имею против пхп — сам раньше на нем немало писал. Просто мне перл интереснее. А первый пункт там стоит не потому что мы считаем пхп недоязыком, а потому что мы пишем на перле и раз было принято решение все переделать, то для нас было очевидным делать это на перле.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 170

      +7
      >> В общем, как настоящие русские парни, мы решили все сломать к хренам собачьим и построить заново, сделав красиво.

      Я бы поаккуратней пользовался такими фразами, для многих это первый сигнал, чтобы поставить вопрос о профпригодности разработчика ;)
        +6
        Тем не менее, иногда это правильный выход :( У меня коллеге досталось на растерзание творение вечносменяющихся студентов… это полбеды еще. Они работали под руководством бывшего военного, который прославился своим высказыванием «perl быстрее sql». Когда система подросла, там вышло боком абсолютно все.
          +23
          Профи должен озвучивать такую мысль как-то так:

          «Исходя из анализа текущей архитектуры и реализации приложения и перспектив дальнейшего его развития и масштабирования, было принято решение тыц тыц тыц...»

          Суть одна, но жопа прикрыта :-D
            0
            Браво :)
        • UFO just landed and posted this here
          +5
          И стоило так мучаться…
            +10
            Я считаю решение со встроенным в сервер скриптовым модулем откровенно фиговым.

            Отдача контента по HTTP-это одно, а выполнение скриптов — совсем другое. Выигрыш от применения легковесных серверов во многом благодаря разделению фронтенд — бекенд. А то все люди удивляются почему у них echo выполняется минуту.

            Тем более у перла такая шикарная работа с fast cgi…
              0
              хочешь собираешь с перлом — не хочешь без перла.
              А вот то что он встроен иногда очень помогает.
                +4
                В принципе можно делать все как угодно, но на нагрузках очень хорошо видно видна разница между концептоми «все в одном» и «фронтенд-бекенд».

                На экстремальных нагрузках два разных сервера юзающие эти разные концепты будут вставать раком очень по-разному.
                +29
                На медленных клиентах мы висим веб сервером вместе с модулем, жрем память.

                В концепции фронтенд-бекенд мы вебсервером быстренько запросили бекенд, бекенд быстренько отстрелялся, дальше веб-сервер берет медленного клиента за руку и ведет его в кино, потом в ресторан, и может быть в номера. Жирный бекенд в это время отдыхает, ресурсы свободны.

                На бекенде может быть все что угодно, главное чтобы лишнего ничего при подготовке ответа не происходило.
                  +4
                  > веб-сервер берет медленного клиента за руку и ведет его в кино, потом в ресторан, и может быть в номера

                  Хах, как написано-то! Смеюсь и рыдаю одновременно). Великолепно!
                +1
                Тож собирался исследовать сей вопрос, но Вы были раньше, спасибо :) Правда у меня немного другого плана эксперимент — нагрузки никакой, зато ресурсов небогато… но это уже лирика. Ниже пара комментов по существу.
                1) Apache::Session — наверное, единственный модуль который вы могли взять не переделывая :) Там от апача одно название, используйте хоть в консоли… По-моему, я даже в документации это видел, но не уверен. Код в свое время довольно детально пришлось изучить, там ничего «лишнего» нет.
                2) попробуйте сделать бенчмарк с разными настройками масона — как у вас и с out_method => $buffer (т.е. чтобы буферизовать вывод, и потом его уже руками из хендлера отдавать клиенту сразу весь). Под модперлом разница в скорости отдачи мягко говоря заметная.
                  0
                  тьфу ты, конечно же
                  out_method => \$buffer
                  +4
                  Интересно, обязательно каждому НЕ PHP-программисту, в топике\комментарии писать, что-то типо: «Я смотрю а там пэхопэ, гавно какое!»

                  Дело не в языке, а в том кто на нем пишет.
                    +9
                    Но на РНР говна много больше, ибо знаний почти не нужно.
                      +2
                      Это, согласитесь, это совсем не проблема PHP. Поэтому с первым тезисом:
                      «обнаружилось несколько серьёзных проблем:
                      Это было написано на PHP;» — я не соглашусь, извините. Второе вполне допускаю: сам постоянно вижу подобный код. Но это далеко не проблема языка. А проблемы в головах искоренить — это утопия. Одним Перлом весь мир не обеспечишь.
                        +2
                        Не принимайте близко к сердцу. Не знаю, как относится к PHP автор, но мне кажется что в любом случае для них проблема — это саппортить PHPшный проект. Иначе бы решение не было сделано на перле :)
                          –8
                          Но это далеко не проблема языка.
                          Увы и ах, но это — проблема языка. PHP — это специальный язык для создания быдлокода и ошибка у него в ДНК.

                          Основная проблема — в подходе: если программист делает идиотское действие (ну не знаю — умножает строку на строку, например), то любой нормальный язык выбросит ошибку. Статические языки сделают это во время компиляции, динамические — в рантайме. PHP же попытается угадать чего на самом деле хотели сделать. Что это значит? А это значит две вещи:
                          1. Такой язык будет безумно популярен так как люди с кривыми руками (но умеренно кривыми руками) смогут на нём порождать нечто работающее.
                          2. 99% кода, созданного на этом языке будут иметь ошибки и уязвимости.
                          Простой рассчёт: если в программе 10'000 операторов и PHP «угадывает» намеренье программиста в 99.9% случаев правильно (неплохой процент, да?), то вероятность получения программы без ошибок — меньше одной сотой процента (а это уже никуда не годится).

                          Не могу назвать perl идеалом, но до PHP ему далеко. С ним из распространённых языков может сравниться только один: JavaScript. Но от него никуда, в общем, не денешься, приходится терпеть. А от PHP нужно избавляться по возможности. Ибо писать на нём хорошие программы так же просто как ездить на одноколёсном велосипеде: ничего невозможного нет, нужно просто больше внимания уделить управлению, но… если вы не в цирке — купите нормальный велосипед и не морочьте людям голову!
                            +1
                            Простите но это ↑ бред, PHP ничего никогда не угадывает, все задокументировано и работает именно так как задумано разработчиками. PHP не требует много знаний или даже прямых рук — но это далеко не проблема языка, это скорей его преимущество так как он позволит «wannabe» программистам сделать что-то из ничего.

                            Все могут PHP но не все могут С++(к примеру) и мы это замечаем, мы видим проблемы в более популярных и более доступных вещах, в любом языке есть плохие программисты, но вот интересная штука, разница между хорошим и плохим С++(к примеру) программистом в том что у обоих программа скомпилируется.

                            Да, кстати достаточно изменить настройку оповещения об ошибках чтоб увидеть что она есть, но не показывается дабы «быдлокодер» не описался, попробуйте.
                              0
                              php -r '$x = «f o o»;$x = explode(" ",$x);print_r($x);'

                              ничего не угадывает, ака
                                0
                                Interactive mode enabled

                                  0
                                  Interactive mode enabled

                                  $x = «f o o»;
                                  $x = explode(" ",$x);
                                  print_r($x);
                                  Array
                                  (
                                  [0] => f
                                  [1] => o
                                  [2] => o
                                  )

                                  А что не так? Я чего-то не понял.
                                    0
                                    Перевод строки в массив — «угадайте, что я хочу»
                                  +2
                                  Простите но это ↑ бред, PHP ничего никогда не угадывает, все задокументировано и работает именно так как задумано разработчиками.
                                  Вашими бы устами… К сожалению всё ровно наоборот: вначале был сделан язык, который пытался сделать «как лучше», а потом это задокументерировали. Тот факт что функция sort может вам выдать неотсортированный массив если звёзды плохо встанут это не отменило.
                                    0
                                    «Будьте осторожны при сортировке массивов, содержащих элементы разных типов, так как в этом случае результат работы функции sort() может быть непредсказуемым.»

                                    Как по вашему должна в данном случае работать функция sort???
                                    Хочешь сортировать сложные структуры данных используй usort().
                                      +1
                                      Как по вашему должна в данном случае работать функция sort???
                                      Хорошие варианты:
                                      1. Бросить исключение или вернуть код ошибки.
                                      2. Завершить выполнение программы.
                                      Плохие варианты:
                                      1. Вернуть массив, который непонятно — отсортирован вообще или нет.
                                      2. «Тихо» привести данные к одному типу и отсортировать массив.

                                      Чем раньше и жёще реакция на ошибки — тем выше шансы на то, что созданная в результате программа будет правильной. Идеал — это Ada, чуть похуже — Java, Lisp и Haskell — тоже ничего так варианты. PHP же в этом ряду находится просто за гранью разумного.
                                  +2
                                  Повторюсь еще раз :)
                                  Хорошие программисты используют язык как ИНСТРУМЕНТ. Плохие — как ПОНТЫ ;)

                                  На любом языке можно хорошо и достойно писать. Почему больше всего плохого кода на PHP вам ответит гугль — просто язык гораздо популярнее многих — соответсвенно народ на нем больше делает — отсюда следствие.

                                  А то что лично Вы назвали в сврем посте плохим как язык PHP так и JavaScript ( который например не только мне очень нравится своим подходом к ООП ) — это говорит о вас как раз о том, к какой стороне программистов принадлежите Вы ;) Без обид ;)
                                    0
                                    Почему больше всего плохого кода на PHP вам ответит гугль — просто язык гораздо популярнее многих — соответсвенно народ на нем больше делает — отсюда следствие.
                                    Я говорил о проценте, не об абсолютном количестве. Тут Гугль не поможет.
                                  • UFO just landed and posted this here
                                      0
                                      ну последнее время перл все больше отмирает. а вот пайтон наоборот, угрожает зохавать похапе :)
                                      Особенно при наличии джанги.
                                        +1
                                        Угу, тока думаю скоро все ваши пайтоны и пхп будут крутиться в новой виртуальной машине перла =)

                                          +1
                                          у «новой виртуальной машины перла» уже есть роадмап со сроками?
                                            0
                                            Да.
                                              0
                                              и каковы сроки?
                                    +8
                                    Ну здесь справедливости ради хочется отметить, что есть еще такие «гуру» перла, которые в одной строчке пишут мегаконструкцию, а-ля «смотрите ламеры и учитесь, слабо такое завернуть», что сразу хочется отведать пионерской PHP-шной лапши.
                                      0
                                      Это уже просто поиграться. Нормальный программист пишет правильно, и так, чтоб в этом через месяцев 6 можно было разобраться.
                                        +3
                                        Такой программист, наверное, в Париже хранится, в палате мер и весов :)
                                  • UFO just landed and posted this here
                                      +1
                                      Судя по моему опыту самолет — говно — нет ручки переключения скоростей, болтается ввер-вниз руль и куча каких-то тумблеров!!!

                                      А кто вы? Вы великий программист и у вас есть с чем сравнивать? Вы пробовали делать проекты на разных языках и сравнивали их по какому-то праметру? Тогда напишите, а так увы — вы очередной «плохой» программист :)

                                      P.S. Очень хорошо отношусь к Python-у, очень быстрый и качественный язык с отличной ООП архитектурой и весьма необычным подходом к блокам кода. Но, к сожелению, пока не такой попуялрный на хостингах (
                                      • UFO just landed and posted this here
                                          0
                                          Баги есть везди, к сожелению. А вот неподкрепленное фактами утверждение весьма плохо говорит о вас, как о профи. Я знаю массу людей, которые отлично пишут на PHP, Ruby и Python-е. И каждый абсолютно нормально относится ко всем языкам на которых пишет. Ибо есть у каждого языка свой сахар и своя соль.

                                          А то, что по Вашему — PHP — говно — означет лишь одно — вы мало писали на этом языке. А про баги — зайдите на багрепорты для пайтона и Руби например. И это нормально. Любой язык развивается, при этом могу и допускаются ошибки. Это и есть эволюция собственно ;)
                                          • UFO just landed and posted this here
                                              0
                                              Однако очень странные у вас аналогии, тогда приведу свою:
                                              заходите вы в магазин, подходите к ветрины с соусами, берет там чили и пробуете… Вы не знаете для чего он и понятно чем Вы его будете считать, а вот то, что получается когда его применяют правильно — я думаю очень бы Вам понраилось, так что — увы и ах ;)
                                              • UFO just landed and posted this here
                                            0
                                            И кстати, Вы так и не указали свой опыт :)
                                            0
                                            Почитал внимательно

                                            Хоть и пишу на Perl, — но не считаю php плохим. Вопрос в том, как ты пишешь — если пишешь бред — зачем вообще писать? И тем более жаловаться что «язык не говорит мне что я пишу бред».
                                            0
                                            А какой у вас опыт, если не секрет? За несколько лет работы пхпшником у меня ни разу не возникало такой мысли
                                            • UFO just landed and posted this here
                                                0
                                                ну поповоду не причечооночти именований функций — это как раз "-" PHP, а вот куски кода работающие по-разному в разгых версиях языка — это увы — проблемы не только PHP ;)
                                                • UFO just landed and posted this here
                                                    0
                                                    Хм… лень мануал смотреть но скорее всего логика такая:

                                                    $foo — строка, она-же является массивом знаков, ну типа $foo=«asdf» и $foo[1] будет 's'
                                                    Мы обратились по ключу «foobar» => ключа такого нет ибо ключи у нас цифровые :) Раз нет, бум считать что ключ = 0. По скольку мы работаем с characters, то он взял только первый символ строки. Теперь по русски :)
                                                    $foo = «asdf»;
                                                    $foo[«foobar»] = «baz» => $foo[0] = 'b'

                                                    Как то так, поправьте меня если я ошибаюсь :)
                                                    • UFO just landed and posted this here
                                                        0
                                                        Это логика кстати, пусть и не тривиальная ;)
                                                        Не все, что не уписывается в Вашу логику — не есть логика.
                                                        За нетривиальность часто, очень часто ругают PHP, но далеко не так категорично, как Вы.

                                                        И кстати Ваш друг более сдержан в критике.
                                                        • UFO just landed and posted this here
                                                            0
                                                            Конечно не означает что PHP можно за такие действия поставить "+". Но вот так категорично судить — это смешно.
                                                            Естественно минус за точто не кидает варнинг — это сложно отлаживать. Однако я, например, придерживаюсь всегда оперделенного стиля программирования, и обычно если делую переменные, которые меняют тип в процессе выполнеия — четко представляю за чем.
                                                            Смысл «нетепизируемости» не в том, что можно по всякому вот так выковряживаться, а совсем в другом.

                                                            Бога ради — пишите на другом, но не рубите с плеча )
                                                            • UFO just landed and posted this here
                                                                0
                                                                ммм? и я с хрипотой кинулся защищать PHP? :-D
                                                                Вы хорошо о себе думаете )

                                                                Поглядите мой самый верхней комментарий, адресованный не вам — и Вы поймете ;)
                                                                  +1
                                                                  Кстати ниже всего этого darkk очень неплохо написал о своем мнении.

                                                                  Можете прочесть это, а потом перечитать свои топики.

                                                                  Еще раз повторюсь — профессионал может считать, что какой-то инструмент не подходит лично ему по таким-то и таким-то пречинам. Он может это говорить ИМХО свое, но никогда не скажет что инструмент — гавно ;) darkk сказал что «мог бы сказать» но не сказал ;)

                                                                  Во-первых вы таким утверждением дискредитируете себя в глазах других программистов, которые используют данный инструмент в своей практике, это раз, а во-вторых это просто элементарное неуважение в принципе.

                                                                  Кстати благодаря PHP движению возникло множество терок из которых потом и повылезали различные решения, принятые в дальнешем на вооружение. Вам не кажется, что только за одно это можно уважать данное сообщество, даже не используя его язык?
                                                                  Isn'it?

                                                                  Собственно спор дальше ниочем считаю бесмыссленым, я не призывал Вас полюбить чтото или начать писать на PHP, и не говорил что PHP — лучший язык ;)
                                                                  • UFO just landed and posted this here
                                                                  • UFO just landed and posted this here
                                                                    0
                                                                    главное тузлы для миграции с phpbb/punbb/… на pybb. я первый свалю.

                                                                    Еще бы миграцию с друпала напейсать :)
                                                                    • UFO just landed and posted this here
                                                                • UFO just landed and posted this here
                                                                  0
                                                                  Я стал значительно терпимее после того, как баги с безопасностью были найдены в микрокоде процессоров Intel (на wasm.ru чудесный топик был на эту тему).
                                                                  И к глюкам разного рода я уже привык — редкий день без отосланного багрепорта обходится. :)

                                                                  Я тоже могу сказать «PHP — говно», мне противен язык с кучей лапши, но это всего лишь инструмент — некоторые задачи (Personal Home Page) он решает отлично и это сложно не признать. Насколько на нём удобно и хорошо писать сложные и большие системы — не знаю, у меня нет опыта написания чего-то огромного на PHP, так, пару чуть менее чем тривиальных сайтиков несколько лет назад.

                                                                  Но это не отменяет моей скромной ненависти к PHP, сдержанного отношения к Perl и тихого обожания Python.
                                                                  :)
                                                                    0
                                                                    :) А какже Ruby?
                                                                      0
                                                                      Гугл сказал Python — значит Python.
                                                                      Достаточно часто слышал про проблемы с производительностью при сравнении ruby vs. python, нет, я знаю, что современные вычислительные мощности бла-бла-бла, и время программиста бля-бла-бла.
                                                                      Но, как мне кажется без вдумчивого изучения ruby, он с python примерно эквивалентен по фишками.

                                                                      А для экзотики хотелось бы поковырять haskell и erlang, да времени не хватает :-)
                                                                        0
                                                                        Есть такое про Ruby vs Python. Haskell глядел… ну так чтото очень крутое, иногда напоминающее по синтаксису regexp-ы :) Как развитие мозга — само то )

                                                                        А пайтон учили по каким материалам? Или консоль + google? ( мой вариант последний — нормальных печатных книг я, к сожелению, не нашел )
                                                                          0
                                                                          Про хаскель я всерьез задумался тогда, когда мне в JS-коде захотелось использовать нечто, что, как я впоследствие узнал, называлось «Y-комбинатор» :-)

                                                                          Питон — под python-docs.tar.bz2 (официальные доки), ничего лучшего тоже не видал… Да и не привыкать документацию читать, начиная изучать программирование с ассемблера :)
                                                                          • UFO just landed and posted this here
                                                                              0
                                                                              Мою душу уже никто не спасет ;)
                                                                              А вот за книжку респект и спасибо!
                                                                              • UFO just landed and posted this here
                                                                                  0
                                                                                  Весьма спасибо, особенно за pydev — не натыкался. Благодарствую
                                                                                    +2
                                                                                    Фанаты Пайтона переучивают пэхапешников на Пайтон в теме про Перл… Я в шоке.
                                                                          0
                                                                          тормозилло.
                                                                          Вообще очень много вкусного внутри, но недоделанный GC и пожирание памяти отбивают всю охоту на нем писать.

                                                                          Потом рубя настолько сильно меняется от версии к версии, что становится страшно.

                                                                          Рубинов в руби много (yaml, literal programming,...) но все это разведено в огромной куче г… на на которую натыкаешся написав первый проект.
                                                                          0
                                                                          использование этих багов, которое грозился показать графоман КК, так никто и не увидел.
                                                                            0
                                                                            Ну да, но наличие багов в микрокоде это не отменяет, а если есть «просто баги», наверняка есть и баги с безопасностью в той или иной форме.
                                                                              0
                                                                              ну баги есть в любой программе длиннее 30 строк.

                                                                              Другое дело, что обновление микрокода даже любой линупс изкаропки делает.
                                                                                –1
                                                                                Ну вы как бы лжете, как минимум про «любой из коробки».
                                                                                  0
                                                                                  про дистры без коробки (генту и подобные) речь не идет.
                                                                                    0
                                                                                    Ну, например, в убунте 8.10 из коробки не обнаружено.
                                                                                    Или, хотите сказать, у убунты коробки нет? :)
                                                                                      0
                                                                                      packages.ubuntu.com/intrepid/intel-microcode

                                                                                      но если его искаропки не пускают — кокноникл окончательно падает в моих глазах.
                                                                                        0
                                                                                        Если я не ошибся, из коробки его нет.
                                                                                        Поставить, да, можно, конечно, но речь шла про искаропку.
                                                                                          0
                                                                                          Слава богу, что я юзаю RH дистрибутивы
                                                                        0
                                                                        а помоему тут вопрос только один фозникает — вы зачем так пишите? Высасывать из пальца примеры надуманные не стоит.
                                                                      0
                                                                      А присвоение ключу строки либо превратило строку в ассоциативный массив (вполне ожидаемое поведение для текстового ключа), либо (о боги!) этот текстовый ключ был неявно преобразован в число, после чего в зависимости от представления строки в разных версиях был взят либо первый её символ, либо '\0'…
                                                                        0
                                                                        ыыы ) Логика есть на самом деле ) Кста у меня ругается в варнинг PHP 5: foo is not array

                                                                          0
                                                                          Ну да, отличная логика, такая, слегка недетерминированная :)

                                                                          Что warning это хорошо — значит, всё-таки баг был отрепорчен не зря.
                                                                          А у вас какая версия? У меня 5.2.6-pl7-gentoo с E_ALL не ругается…
                                                                          При том я нашел четвертый вариант результата выполнения кода — строка не меняется вообще:
                                                                          $ php -r '$foo = «asdf»; $foo[«foobar»] = $foo; var_dump($foo);'
                                                                          string(4) «asdf»
                                                                            0
                                                                            ммм… странно действительно. у меня PHP 5.2.6.6
                                                                            • UFO just landed and posted this here
                                                                                0
                                                                                кажется в баг репорте вам внятно ответили:

                                                                                In your code:

                                                                                $name = «foobar»;
                                                                                $name['anything'] = $name;

                                                                                $name['anything'] is addressing a string offset, 'anything' is casted to
                                                                                0 so you're overwriting the first character of $name with $name.

                                                                                The first result, string(6) «oobar», is looking like it's overwriting
                                                                                the first byte with a null byte, which isn't what one expects but
                                                                                related to the way PHP optimizes access to variables, which isn't made
                                                                                for «wrong» code.

                                                                                для «просветленных»:

                                                                                фактически ваш код

                                                                                $foo = «foobar»;
                                                                                $foo[«foobar»] = $foo;

                                                                                равен этому

                                                                                $foo = «foobar»;
                                                                                $foo[0] = «f»;

                                                                                • UFO just landed and posted this here
                                                                                    0
                                                                                    с чего это он даёт разные результаты?

                                                                                    проверте это

                                                                                    function foobar($name) {
                                                                                    $name['anything'] = $name;
                                                                                    var_dump($name);
                                                                                    }

                                                                                    $name = «foobar»;
                                                                                    foobar($name);

                                                                                    $name = «foobar»;
                                                                                    $name['anything'] = $name;
                                                                                    var_dump($name);

                                                                                    результат:

                                                                                    X-Powered-By: PHP/5.2.5
                                                                                    Content-type: text/html

                                                                                    string(6) «foobar»
                                                                                    string(6) «foobar»

                                                                                    • UFO just landed and posted this here
                                                                                        0
                                                                                        приведенный мною пример несколько отличается от того, что в баг репорте.

                                                                                        подумайте, в чём разница (домашнее заданее).

                                                                                        более того, я уверен что мой пример будет работать ОДИНАКОВО для ЛЮБОЙ версии пхп5.

                                                                                        хинт: в пхп5 и пхп4 данные передовались в функцию по-разному…

                                                                                        таких косяков навалом и в вашем (и моём :) любимом пайтоне
                                                                                        • UFO just landed and posted this here
                                                                                            0
                                                                                            никакой workaround я не нашел.

                                                                                            всё намного проще, type juggling как обычно…

                                                                              0
                                                                              понятно что она не меняется. если взять например логигу коментом выше то получается вы запихали в первый(ака нулевой) байт строки $foo первый же байт строки $foo )))
                                                                                0
                                                                                на самом деле тут всё логично и то что одно версия пхп выдает варнинг а другая нет не означает что результат будет разный. тут всё очень логично: строка это массив байтов. естественно индексы у этого массива цифровые и мы можем спокойно писать ['0'] или ['1'] или даже ['10px'](px будет успешно отброшено) т.к. php преобразует строку в интеджер, то что «foobar» преобразовывается в 0 тоже логично.(Оф. документация по intval: Strings will most likely return 0 although this depends on the leftmost characters of the string. The common rules of integer casting apply. )
                                                                                Зато php не заставляет нас загромождать код преобразованиями строки в integer.
                                                                                А то что глупые программисты могут превратить эту фичу в баг это их проблемы.
                                                                                  0
                                                                                  Разный результат на разных версиях был получен экспериментально и стоил нескольких часов отладки.

                                                                                  Я не спорю, что пример — ацкий ацтой, но это тот случай, когда warning выдавать лучше, чем тупо кастовать строчку к числу.

                                                                                  Если хотите подробностей, вот этот баг: bugs.php.net/bug.php?id=45400
                                                                                    0
                                                                                    скажите, может ли в реально ситуации встретиться код $name['anything'] = $name;? да согласен в таком случае логичнее вывести варнинг. но если писать
                                                                                    $name['anything'] = $name2; то никакого варнинга ненадо. такой код логичен.
                                                                                      0
                                                                                      и я не отрицаю что результат выполнения $name['anything'] = $name; в контексте функции это баг. вобщемто если поправить то можно и без варнинга обойтись
                                                                                      • UFO just landed and posted this here
                                                                                          +1
                                                                                          страшно то, что этот код вообще ВЫПОЛНЯЕТСЯ
                                                                                        +1
                                                                                        в том то и дело, что не может.

                                                                                        если встретился — надо упасть с ошибкой 500 а не продолжать выполнение с непредсказуемым результатом.
                                                                                          0
                                                                                          Более того, такой код встретился и именно изменение поведения между версиями и обратило на себя внимание. Я не спорю с тем, что код — дрянь, но я считаю, что такое поведение для кода $string[$another_string] не логично и далеко не очевидно, что строка-индекс будет прикастована к целому.
                                                                                      • UFO just landed and posted this here
                                                                                      0
                                                                                      PHP/5.2.5

                                                                                      string(4) «asdf»
                                                                                0
                                                                                Нет, я все понимаю, что compatibility надо иногда ломать, но всё же…

                                                                                Например, в том же питоне была выпущена версия 2.6 где при исполнении кода, который поломается в 3.0, выдавались предупреждения.

                                                                                А все варианты результата этого кода, коих три: "\0oobar", «foobar», и array('foobar' => 'foobar') — вот все эти три варианта проявляются в различных версиях 5.2.x (может быть я все-таки ошибаюсь про все три, но абсолютно точно — два из них в 5.2.х и все три в 5.х).

                                                                                Отсюда вывод: либо они слишком часто любят ломать совместимость, либо данный интерпретируемый язык не выдает warning-ов при таком очевидном и довольно тривиальном «undefined behaviour» — это его никак не красит.
                                                                                Стоит также заметить, что в данном случае речь не про стандартную библиотеку, не про криворуких кодеров — речь про дизайн языка.
                                                                                  0
                                                                                  cдаётся мне, первый, кто напишет для «кривых, плохих, тупых, нелогичных и вообще корявых» функций враппер в виде “красиво и правильно именованных” функций и выложит его в виде pecl-модуля станет просто мега-героем…
                                                                                  • UFO just landed and posted this here
                                                                                      0
                                                                                      зачем оно в ядре? лично меня устраивают и такие названия.

                                                                                      а вот пекл — самое оно… хочешь — ставишь, не хочешь не ставишь…
                                                                                      • UFO just landed and posted this here
                                                                                          0
                                                                                          ну лично у меня не пухнет, наверное у меня неправильный мозг.

                                                                                          можете предложить ваши варианты названий для этих функций (просто интересно).

                                                                                          preg_match_all прекрасно работает с UTF-8, надо только уметь читать мануал, в котором чётко написано про модификатор u. а те кто не умеют читать — видимо сейчас заполняют баг-репорт…
                                                                                          • UFO just landed and posted this here
                                                                                            • UFO just landed and posted this here
                                                                                                0
                                                                                                ну вот видите :)

                                                                                                мне даже кажется, что если залезть с сорцу пхп, то там все эти функции сделаны именно так, как вы описали, а именно флагами от одной функции добиваются нужного эффекта…

                                                                                                поверьте и у случае с флагами было бы огромного количество недовольных «этой тупорылой функцией сортировки массивов с тучей мрачных флагов»
                                                                                            • UFO just landed and posted this here
                                                                                                0
                                                                                                А это как раз не проблема. В PHP5 нет юникодных строк и потому «character position offsets» никому и даром не нужны.
                                                                                              +1
                                                                                              Да ладно имена. Чёрт с ними. Вы мне объясните — кем надо быть чтобы создать такой ублюдочный API для регулярных выражений? Вы посмотрите на эту функцию:
                                                                                              int preg_match_all ( string $pattern, string $subject, array $&matches [, int $flags [, int $offset ]] )
                                                                                              Какой диагноз? Правильно: расстрел на месте через повешенье.

                                                                                              Почему так? Потому что работа с регулярными выражениями состоит из двух частей:
                                                                                              1. Создание конечного автомата из регулярного выражения (задача весьма медленная и, как правильно, не оптимизированная).
                                                                                              2. Поиск в строке с использованием ранее построенного автомата.
                                                                                              Разница в скорости работы этих фонкций — порядки! Для сложных регулряных выражений — сотни и тысячи раз! Что мы имеем в PHP? Правильно: эти две операции объединены! Притом что в используемой библиотеке они, как и положено, разнесены по разным функциям (что должно было бы, в общем, заставить задуматься).

                                                                                              Я не против функций, объединяющих эти действия — иногда этот гибрид вполне может оказаться полезным (скажем вы обрабатываете регулярным выражением ровно одну строку). Но когда это — основной и единственный API… И после этого вы продолжаете утверждать что PHP писали вменяемые люди?
                                                                                                0
                                                                                                у вас есть реальные замеры производительности в языке с типа_прекомпайлингом патерна и пхп?

                                                                                                просто интересно
                                                                                                  0
                                                                                                  Чушь собачья. Вообще-то можно элементарно кешировать откомпилированные последние использованиные регекспы.

                                                                                                  А то, что поиск работает быстрее компиляции — вообще чушь собачья. возьмите-ка текст на 50 Кб и простенький регекксп и посмотрите.

                                                                                                  А то что вы предлагаете, отдельно сделать компиляцию регекспа, а отдельно — выполнение, так идите-ка вы подальше с такими идеями, делать мне больше нечего писать всюду теперь по 2 функции вместо одной!
                                                                                    0
                                                                                    Facebook.
                                                                                    Вы просто не умеете его готовить.
                                                                                    • UFO just landed and posted this here
                                                                                        0
                                                                                        Я вполне себе питон фаг и пишу на джанге, но silver bullet технологий в вебе нет, поэтому радиус кривизны рук решает :)

                                                                                        >Как это оносится конкретно к тому факту, что я считаю php говном и не использую его?
                                                                                        видимо, надо было аргументировать свою точку зрения :)
                                                                                • UFO just landed and posted this here
                                                                                    0
                                                                                    Разработку это не сильно задержало, зато доставилонемало удовольствия.
                                                                                    А распарсить одну строку — это же не долго.
                                                                                    0
                                                                                    А не страшно использовать конечный автомат для такого?

                                                                                    Как мониторите среднее время выполнения запроса и сколько запросов в секунду обрабатываете на ядро?
                                                                                      0
                                                                                      Да почти до последнего момента были сомнения. Но все закончилось хорошо =) Мы рискнули и все получилось.

                                                                                      мониторим стандартно. в начале обработки запроса смотрим время и потом из времени окончания запроса вычитаем начальное. Пока нагрузка небольшая — чуть меньше 50 запросов в секунду
                                                                                      +1
                                                                                      И стоило так мучатся при наличии таких превосходных инструментов как Catalyst и Muse?
                                                                                        +1
                                                                                        Конечно. Уверен, авторы каталиста тоже пробовали подобные штуки :)
                                                                                      • UFO just landed and posted this here
                                                                                          0
                                                                                          Круто замешан колобок :)

                                                                                          Я уже думал, что окончательно просветлился, но сейчас понимаю, что я реально в танке.

                                                                                          Выходит, то что я написал выше про фронтенд-бекенд — это несущественная фигня по сравнению с этим?
                                                                                          Что значит «масштабируемость от числа воркеров», можно чуть подробнее?
                                                                                          И чем отличается выполнение «в самом себе» перла от отдачи картинки или запроса на бекенд?
                                                                                          • UFO just landed and posted this here
                                                                                              +1
                                                                                              Спасибо, суть я кажется уловил. Проблема в том что воркер «поперхнется» запросом на обработку встроенного перла и вся очередь встает, то есть нужно вешать больше воркеров, чтобы очереди были короче.

                                                                                              Отличие от запроса на бекенд здесь в том, что воркер умеет «распараллеливать» такие вещи, а обработку встроенного перла — нет.

                                                                                              Я правильно понимаю?
                                                                                              • UFO just landed and posted this here
                                                                                                  0
                                                                                                  Отлично. Спасибо за взрыв мозга, пошел грызть теорию до полного просветления…
                                                                                                    0
                                                                                                    я так понял, что вы фактически перечеркнули результаты работы «настоящих русских парней»?
                                                                                                      0
                                                                                                      Не совсем =)
                                                                                                      Если воркер начинает захлебываться от потока запросов, то не будет никакой разницы на бэкэнде он или на встроенном перле. Клиент будет тупить пока до него очередь не дойдет.
                                                                                                      Все равно в таком случае надо что-то делать
                                                                                                      • UFO just landed and posted this here
                                                                                                          0
                                                                                                          Вы правы, но статика крутится у нас на отдельном сервере.
                                                                                            +2
                                                                                            А расскажите в двух словах о преимуществах подобной архитектуры перед связкой fastcgi<->nginx?
                                                                                              +2
                                                                                              Малодушество. fastcgi-nginx просто работает.
                                                                                              А это — широкий жест, все поломать и заново сделать по-своему.
                                                                                                0
                                                                                                ну вот и у меня fastcgi+nginx радостно работает, но ведь нужно стремится к совершенству :)
                                                                                                вдруг у описываемой системы есть какие-то подводные алмазы, которых я не знаю?
                                                                                              0
                                                                                              Весьма интересно, спасибо вам!
                                                                                                0
                                                                                                Скорее всего, даже если бы вы решили все перекодить, но при этом оставили бы первый пункт в покое и исправили бы следующие два, то гемора было бы намного меньше.
                                                                                                  0
                                                                                                  Прочитал статью, отложил в ящичек, решил попробовать при случае, порадовался даже слегка, а потом почитал коменты и понял, что все же mod_perl наше всё. Отличную работу провели в статье, вот только инструменты не те, да-с, совсем не те, как оказалось.
                                                                                                    +1
                                                                                                    Главное, что это прецендент — перл в nginx юзабелен, и это на самом деле немаленькое достижение :)
                                                                                                      0
                                                                                                      Осталось понять, зачем к маленькому быстрому nginx прицепить большой тяжёлый perl.
                                                                                                      +2
                                                                                                      Читается как фэнтэзи. Герои попали в необычную ситуацию и вынуждены делать ответственную работу в сжатые сроки и в непривычных условиях.
                                                                                                        0
                                                                                                        За быдлокод надо руки отрывать, сразу все быстро научатся писать нормально.
                                                                                                          +2
                                                                                                          очень интересно, что скажут люди, которые сей проект будут (рано или поздно) обновлять (расширять, менять)? думаю, много (не)лестных слов в адрес «джедаев» :))
                                                                                                            0
                                                                                                            Можно это все перевести на fastcgi. изменения должны затронуть не намного больше кода, чем написано в конце топика
                                                                                                            +1
                                                                                                            Спасибо за интересную статью. Сам я благополучно (и с удовольствием) забыл перл лет этак пять уже как.
                                                                                                              +1
                                                                                                              Ну зря вы mod_perl обижаете. Всё там очень хорошо и интересно ;)
                                                                                                              А встроеный энжайновский перл исключительно для маленьких быстреньких скриптов.
                                                                                                                0
                                                                                                                Да я не обижаю. Просто хотелось «новых отношений» =)
                                                                                                                +2
                                                                                                                Сильные духом бы, написали сайт как модуль к nginx, или встроели бы в него bf, и реализовали на нем :)

                                                                                                                Вот это сила духа, вот это да! А у вас…
                                                                                                                  0
                                                                                                                  не надо искушать =)
                                                                                                                  • UFO just landed and posted this here
                                                                                                                      0
                                                                                                                      Ну если уж на то пошло, то нужно делать сайт как отдельную операционную систему
                                                                                                                      • UFO just landed and posted this here
                                                                                                                          0
                                                                                                                          Решено! Паяю сайт на лампах!
                                                                                                                          • UFO just landed and posted this here
                                                                                                                              0
                                                                                                                              У шестеренок нету совместимости с ethernet. а переходик делать трудно очень
                                                                                                                        0
                                                                                                                        Вы — слабый духом, ибо не понимаете в чем сложность сделать сайт как модуль для ядра и в чем сложность написать сайт на bf.
                                                                                                                        • UFO just landed and posted this here
                                                                                                                      • UFO just landed and posted this here
                                                                                                                          0
                                                                                                                          bf — имелось ввиду brainfuck, наверное
                                                                                                                          • UFO just landed and posted this here
                                                                                                                        0
                                                                                                                        Вообще-то путать асинхронный сервер, и синхронно выполняемый язык это — дибилизм.
                                                                                                                          0
                                                                                                                          Появилась необходимость обработать POST запрос на стороне nginx, доку вроде нашел, но все же не смог разобраться толком.
                                                                                                                          Пакет у меня: nginx-0.7.67-1.fc13.i686
                                                                                                                          Вот такое я накодил:

                                                                                                                          use nginx;
                                                                                                                          package mymodule;
                                                                                                                          our $r;
                                                                                                                          sub check_input {
                                                                                                                          $r = shift;
                                                                                                                          if ( $r->request_method eq 'POST' ) {
                                                                                                                          $r->has_request_body( \&mymodule::check_input_process_post );
                                                                                                                          }
                                                                                                                          return 0;
                                                                                                                          }
                                                                                                                          sub check_input_process_post {
                                                                                                                          return 1;
                                                                                                                          }

                                                                                                                          1;
                                                                                                                          __END__

                                                                                                                          в результате, получил ошибку сегментации

                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: signal 17 (SIGCHLD) received
                                                                                                                          2010/09/14 15:30:12 [alert] 2488#0: worker process 2526 exited on signal 11 (core dumped)
                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: start worker process 2539
                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: signal 29 (SIGIO) received
                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: signal 17 (SIGCHLD) received
                                                                                                                          2010/09/14 15:30:12 [alert] 2488#0: worker process 2524 exited on signal 11 (core dumped)
                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: start worker process 2541
                                                                                                                          2010/09/14 15:30:12 [notice] 2488#0: signal 29 (SIGIO) received

                                                                                                                          с помощью научного тыка, выяснил, что проблема у меня в:
                                                                                                                          $r->has_request_body( \&mymodule::check_input_process_post );

                                                                                                                          судя по логам измеенений, ранее была проблема с $r->has_request_body, но начиная с версии 0.6.22 должны были устранить…

                                                                                                                          … кто-то может мне помочь? )

                                                                                                                          Only users with full accounts can post comments. Log in, please.