phpFastCGI: настоящий FastCGI для PHP

    — Добрый день. Вы наверняка уже наслышаны о протоколе FastCGI, он связывает Веб-сервер и сервер приложений, его реализации есть во множестве языков. Однако, в PHP реализация FastCGI до недавних пор была представлена лишь патчем PHP-FPM, который фактически не давал прироста производительности перед mod_php, поскольку он, вопреки идеологии FastCGI, перезапускает скрипт каждый раз заново. Идеология FastCGI подразумевает единовременную инициализацию приложения при запуске (подгрузку нужных классов, соединение с базой данных, и т.д.), и выполнение запросов один за другим.
    phpFastCGI — правильная реализация FastCGI, которая позволяет добиться немыслимой производительности.
    Разработка идёт очень активно, и новые фичи появляются очень быстро.
    Страничка проекта — phpfastcgi.googlecode.com
    Пример простого приложения — code.google.com/p/phpfastcgi/source/browse/trunk/example.php
    В действии пример можно увидеть здесь — ya-tv.ru/phpfastcgid (может переодически лежать, это нормально, идёт тестирование). Страничка-пример легко выдерживает 5,000 запросов в секунду всего на 20-ти воркерах.
    Проект пока в стадии тестирования и живёт только в SVN.
    Приглашаю всех заинтересовавшихся принять в нем посильное участие!
    $ svn checkout phpfastcgi.googlecode.com/svn/trunk phpfastcgi

    Число фич довольно велико, среди прочего поддерживается chroot, плавное обновление рабочего скрипта (ручное и автоматическое), плавный перезапуск (ручное и по достижению максимального кол-ва запросов, предела памяти, времени простоя). Среди прочих бенефитов: теперь вам не придется думать о парсинге %uXXXX в параметрах запроса, это происходит автоматически.
    В скором времени будет расширена документация и будет реализован apache-like метод запуска воркеров.

    Должен заметить, что Windows-платформы никак не поддерживаются и для работы требуется PHP >= 5.3 собранный с '--enable-pcntl' '--enable-shmop' '--enable-sockets'.

    Не судите строго, ведётся разработка, это пока не stable релиз.
    Спасибо за внимание!

    UPD:
    Реализовал поддержку multipart-форм, аплодов, оптимизировал код, реализовал хеш состояний воркеров.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 197

      –19
      Мммм… php-fpm?
      • UFO just landed and posted this here
        +2
        Круто, что интересно, сервер для php разрабатывается на самом же php. :)

        Вечером посмотрю повнимательнее…
          +3
          Да, при этом если и нужно что-то оптимизировать, то только метод FastCGI::iterateRequest, которая собственно и принимает запрос, об остальном можно совершенно не переживать.
          +3
          угу только готовьтесь к тому что программировать придется иначе.
          И еще можно хоть какие-то данные по поводу выйгрыша в производительности?
            +3
            Выигрыш в производительности напрямую зависит от приложения (выигрыш в избавлении от еже-запросной инициализации).
            Страничка-пример легко выдерживает 5000 запросов в секунду на 20 воркерах :-)
              +1
              а можно привязывать вопрос и воркера? чтоб не переиницыировать состояния некоторых объектов
                +1
                ой опечатался запрос тоесть например ссесию к воркеру привязать?
                  +1
                  Я думал об этом, однако понял что так делать не стоит, т.к. воркер может быть занят, может умереть, и т.д. и т.п. Для хранения объектов лучше использовать кластер Redis/Memcache.
                  Однако, общесистемные объекты имеет смысл кешировать (например, показания статистики, которая обновляется раз в 5 секунд). То есть хранить в Redis/Memcache, но обновлять в локальной памяти лишь переодически.
                    0
                    тоесть воркерам дать возможность накапливать данные и регулярно сбрасывать свой кеш, что ж согласен так сложность системы будет существенно ниже, и соответственно выше надежность.
                      0
                      но все же преимущество перед fpm не указаны
                  0
                  а без fastcgi сколько?
                    –1
                    Не знаю, но разница будет не особенно велика по причине простоты примера, там инициализация состоит из одной строчки: $counter = 0;
                      +23
                      тада либо уберите этот маркетинговый мусор, либо сделайте нормальный пример.
                        +1
                        >Страничка-пример легко выдерживает 5,000 запросов в секунду всего на 20-ти воркерах.

                        То есть, получаем 150 запросов в секунду на 1 «воркере».
                        Я конечно не знаю какое там железо, но учитывая крайнюю простоту примера можно быть уверенным, что вариант без fastcgi проявит себя не хуже, а может быть даже и лучше.

                        Лучше сделайте пример посложнее, с массивной инициализацией (например, с подгрузкой конфигов), или с использованием долгоживущих объектов в памяти (например пул баннеров). Вот тут-то технология fastcgi проявит себя с лучшей стороны.
                          +1
                          сорри, имел в виду 5000 / 20 = 250 запросов в секунду ))

                          P.S. весьма полезное дело делаете, думаю, многим пригодится
                            0
                            Ну во-первых это всего на 8 воркерах nginx'а и 20 воркерах phpFastCGI, во-вторых последний тест на них же.
                            Requests per second: 5183.23 [#/sec] (mean)

                            Процессор вообще не загружен. Если поставить 32 воркера nginx и 300 воркеров phpFastCGI… результат будет чуток другой.
                            Вообще эти цифры приведены для того чтобы людей не терзали сомнения относительно распределения нагрузки и скорости… Ясен пень что надо тестировать на реальной системе и там уже воспринимать данные бенчмарка как объективные показатели предельной нагрузки. А сейчас эти данные можно лишь сравнивать и радоваться новым оптимизациям :-)
                              0
                              а есть цифры сравнения с php-fpm
                              если там взять аналогичные настройки:
                              хотя вполне достаточно 8 воркерах nginx'а и 8 воркерах php-fpm
                                0
                                а есть цифры сравнения с php-fpm
                                если там взять аналогичные настройки:
                                хотя вполне достаточно 8 воркерах nginx'а и 8 воркерах php-fpm
                              0
                              да hello world из ZF вывести — чем не тестирование
                                0
                                гы гы да уж реально не фраймворк, но монстр экстракласса, действительно в режиме fastcgi его использование будет намного менее накладно
                          +1
                          где про это можно более детально почитать
                          те какие процессы, сайты лучше запускать через fastcgi а какие по средствам mod_php
                            0
                            хотелось бы что-то более\менее подробное в нете как правило ограничиваются двумя\тремя фразами предложениями
                              0
                              все просто идеалогия fastcgi такова:
                              работает процесс постоянно ему иногда приходят данные и вызывают иницирующую функцию (аналог main() ) соответственно экономия только на этапе инициализации и не выгружаемого из процесса кеша. Достаточно весомые преимущества в высоко нагруженных системах
                          0
                          угу только готовьтесь к тому что программировать придется иначе.

                          Ничего страшного, в Django всё работает по такому же принципу :) Только там используется flup и работа с FastCGI/WSGI скрыта.
                          +3
                          Пример работает чудовищно быстро!
                            +2
                            напомнило мне анекдот университетский
                            Приходит студент в лабораторию и заявляет:
                            — я дома собрал по чертежам в интернете торсионную установку и получил выдающиеся результаты
                            Лаборант: — да и какие же?
                            — Я обработал торсионным полем кусок меди и он стал в 10 раз более проводим!
                            Л: — Хм очень интересно, можно взглянуть?
                            С: — да конечно, вот он!
                            Л: приходите завтра
                            Студент утром ждет лаборанта, а когда тот приходит допытывает его
                            — ну как вы зафиксировали мои выдающиеся рузультаты?
                            Л: -да это медь и проводимость у нее как у меди
                            С: — НЕ МОЖЕТ БЫТЬ вы хотите украсть мой экземпляр!
                            Л: — не паникуйте вот ваш кусок меди заберите его.
                            С: — ну как же так?
                            Л: — если не секрет, то чем вы меряли сопротивление проводника
                            и тут студент гордо достает из кармана китайский тестор у которого погрешность в разы больше чем сопротивление такого малого куска меди и гордо заявляет
                            С: — ЭТИМ!
                              0
                              Это, кстати, не анекдот, а случай из жизни. Только участвовали не лаборант со студентом, а целая комиссия с одной стороны и горе-изобретатель с другой. Читал расшифровку протокола заседания комиссии — практически, слово в слово. Увы, ссылку на источник не дам, ибо потеряна за давностью лет.
                            0
                            Наш супер-компьютер настолько быстр, что выполняет бесконечный цикл за 15 секунд :)
                            +4
                            Это супер-мега крутотень.
                            Мы тут с другом тоже пытаемся такую штуку наваять. Правда пока у нас все еще даже до альфы не дошло.
                            Немножко кода мона глянуть на: sourceforge.net/phastcgi
                              +4
                              Ой. нета линка: sourceforge.net/projects/phastcgi/
                                +3
                                Посмотрел. Думаю, будет хорошо если вы присоединитесь.
                                  0
                                  За приглашение спасибо :) Но мы пока все таки лучше сами. Участие в таком проекте с незнакомыми людьми — все таки большая ответственность. Не хотелось бы подписываться под тем чего заранее не сможешь выполнить.

                                  Да и 3 человека для такой задачи както многовато. Будем мешать друг другу и тянуть одеяло :))
                                  Я думаю лучше почаще заглядывать друг другу в код и находить там интересные вещи. Например функции pack/unpack для меня были большим открытием :)
                                    0
                                    Повнимательнее посмотрел ваш код… уверен, подсматривание будет односторонним. Только не воруйте код, пожалуйста =) Хотите писать — пишите сами с нуля.
                                      0
                                      Вы меня обидели два раза :)
                                      1 раз какбэ сказав что мой код плохой
                                      2 раз какбэ сказав что я похож на человека который будет воровать чужой код.
                                        0
                                        1. Я не хотел никогда обижать, просто IMHO судя по коду — без копирования идей (и/или кода), проект вообще не вырастет в нечто внятное и юзабельное =)
                                        2. Подсматривание с этим граничит =)
                                +2
                                все присоединяйтесь к разработке phpfastcgi от TravisBickle
                                • UFO just landed and posted this here
                                    +1
                                    Да, дня за 4 написал фактически :-) Значительно раньше будет Stable-релиз.
                                      +2
                                      Ну на самом деле мы ее делаем тоже не так дого. И не так много как хотелось бы :) Если обратить внимание на статистику коммитов то реально этим делом занимались тока 3 дня :)

                                      Но мы под впечатлением и теперь будем усиленней пендалить :)) Идея класная. Ну и не может же быть так что бы плохая идея пришла в голову двум людям одновременно? Так бывает только с плохими идеями :)
                                        +2
                                        а зачем вести несколько проектов если можно объединить усилия?
                                          +2
                                          Конкуренция обычно идёт на пользу потребителям
                                            0
                                            тут собралось 2 альтруиста.
                                              +3
                                              В данном случае вряд ли пойдет.
                                            0
                                            Идея мне пришла очень давно, как только я увидел PHP-FPM, однако руки не доходили приняться за реализацию.
                                            А надо ли педалить? =)
                                              0
                                              да здравая и очень логичная идея удивительно что разработчикам пхп она досих пор таковой не кажется — вот это да удивительно
                                          –4
                                          А в чём разница ваших выкрутасов с пыхпыхом и обычного php-fpm в связке с акселератором? (который кеширует «откомпиленный» ПХП код?)
                                          Имхо это будет даже медленнее....:)
                                            0
                                            А вы хотя бы первый абзац прочитали?
                                              +4
                                              Угу. Даже в код заглянул. Прежде чем минусовать, попробуйте включить голову и найти хотя бы одно отличие.
                                              PHP-FPM использует (на сколько я знаю, префорк) в этом случае — используется всё тот же префорк. Только ручной.
                                              Идём далее — код внутри цикла — всё тот же висящий всё время в памяти ОП-КОД.
                                              Где хотя бы одно преимущество?
                                              Перед тем, как начинать развивать проект дальше, погонять тесты слабо?
                                                0
                                                А коннект к базе данных у Вас тоже в оп-код закеширован? ;-)
                                                  0
                                                  php.net/mysql_pconnect
                                                  cпасёт отца русской демократии.
                                                    +1
                                                    спасет, тока одно комплексное решение, а другое частное
                                                      –1
                                                      К примеру, в реализации клиентов для Redis/Memcached нету pconnect'а.
                                                        –5
                                                        А зачем там pconnect?
                                                        Мемкейчед сервер разумно ставить на том же сервере, или как минимум в локалке.
                                                        И накладные расходы на этот коннект будут минимальны. А следовательно и оптимизировать тут нечего.
                                                        Я считаю, что оптимизация ради оптимизации зло. И оптимизировать нужно узкие места. Те — которые тормозят.
                                                        Хотя ваш «проект» имеет место на жизнь. Только, боюсь, полезность стремится к нулю :(
                                                          +2
                                                          Я посмотрю, Вы не работаете с highload'ом. Вот ведь дураки сидят в Facebook — кучу времени потратили на исправление memcached для лучшей работы с UDP, чтоб убрать overhead TCP-коннектов? ;-)
                                                          > Я считаю, что оптимизация ради оптимизации зло. И оптимизировать нужно узкие места. Те — которые тормозят.
                                                          Вы безусловно правы. Сайты-визитки, домашние странички и прочее, куда ходят два с половиной человека в день можно писать практически как угодно и не думать об оптимизации. Данный же топик обращен к тем людям, кто занимается несколько другим классом задач.
                                                            –3
                                                            Давайте вы не будете давить своим мнимым авторитетом?
                                                            При чём здесь фейсбук? В фейсбуке, возможно, оверхеад TCP коннектов и стало узким местом. Только сомневаюсь я, что в каком-либо из ваших проектов эта проблема имеет место быть.
                                                            Без разницы какие это сайты. Высоко-нагруженные или сайты с посещением 1 чел\сутки.
                                                            Мне вот интересно, вы математические операции битовыми ещё не заменяете? А то ведь кучу времени сэкономите… Советую…
                                                              0
                                                              Есть люди которые просто чего-то не понимают, но отказываются это признавать.
                                                            +1
                                                            ua2.php.net/manual/en/function.memcache-pconnect.php
                                                            а это тогда что?
                                                            про Redis не знаю
                                                              +1
                                                              Это — кривое расширение ;-)
                                                                –3
                                                                Посмею заметить — это оупенсоурс решение.
                                                                И если даже оно кривое — ни кто не мешает его сделать ровным.
                                                                  +3
                                                                  ни кто не мешает его сделать ровным
                                                                  Капитан, мы рады что вы здесь. Но посмотрите внимательнее, речь идет о существующих решениях, а не о гипотетических.
                                                                    –1
                                                                    Это решение тоже существует. И оно точно такое же кривое как и то, что предлагается здесь. (возможно пока).
                                                                    Так почему бы не вложить время в действительно 100% правильно работающий код?
                                                                      +1
                                                                        0
                                                                        Я, например, и 20% не дам, что ваше комплексное решение будет работать как часы даже после года фиксов.
                                                                          0
                                                                          а и не нужны ваши % -)
                                                                0
                                                                не не не боже упаси вас от этого — почитайте сколько из за этого багов вылезает. конекты неконтролируемо рвутся и решать это трудно.
                                                                  –1
                                                                  хм, у меня уже почти год работает под нагрузкой и никаких проблем…
                                                          +2
                                                          погонять тесты я уверен необходимо, но идеологически тут во первых может быть инициализация соединений с БД например, установка всех начальных значений все это помноженное на огромное количество инициализаций дает прирост. Вы сами подумайте.
                                                          1. создание объектов и агрегатов объектов (пересоздавать нада только нужные + вы можете создавать коллекции)
                                                          2. Открытие соединений к БД
                                                          3. Локальный стек статистики, который вы можете чистить регулярно а не каждый запрос.

                                                          я уверен придумать места где будет экономия можно еще — это только основные.
                                                          а вообще на основе этой штуки фактически создается событийная машина полноценная, с циклами состояний (например агрегаторы фидов рекламных где запросы очень долгие к сторонним серверам делаются влет), а на основе PHP-FPM вы этого не сделаете именно из за ежекратного перезапуска
                                                            +1
                                                            Локальный стек статистики, который вы можете чистить регулярно а не каждый запрос.

                                                            Да ну? Получается несколько стёков — для каждого воркера — СВОЙ.
                                                            Те же яйца, только в профиль.
                                                            Да и вообще. Я несколько лет угробил на демонов написанных на ПХП. Правда задачи были немного другие.
                                                            Так вот. Готовьтесь к граблям: 1) утечки памяти. 2) скрипт начинает жрать слишком много проц. времени 3) коннект с бд пропадает после нескольких минут не активности.
                                                              0
                                                              Мы тут все надеемся на GC в 5.3 :) Хотя да, проблема имеет место быть и с этим неизвестно как бороться
                                                                0
                                                                Воркеры, обычно, перезапускаются после N отработанных запросов. Изменяя это N можно избавиться от этой проблемы.
                                                                  +1
                                                                  да не кстати у меня демоны которые парсили кучу данных работали месяцами и ничего так и не было там утечек особо (ну за 2 месяца 12 метров набежало на 20 процессов — смешно и в рамках погрешности) да и перезапуск не дорогая процедура. а так писать просто аккуратно если то и GC не нужен
                                                                  +2
                                                                  1) Прямые руки, GC, перезапуск.
                                                                  2) Может это из-за кривых рук? В данном проекте ничего подобного нет.
                                                                  3) Вообще-то это настраивается и делается, например, mysql_ping(). Если все-таки порвался его надо восстановить.
                                                                    –1
                                                                    1) Прямые руки, GC, перезапуск.

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

                                                                    2) Может это из-за кривых рук? В данном проекте ничего подобного нет.

                                                                    Писался демон для отдачи статики. После нескольких суток отдачи больших по размеру файлов (в пике было около 900 одновременных потоков), демон начинал дёргаться как угорелый и сжирал 80% проц. времени. Я так и не нашёл в чём была эта проблема.
                                                                    Замечу — что утечек в том скриптике не было вообще.

                                                                    Вообще-то это настраивается и делается, например, mysql_ping(). Если все-таки порвался его надо восстановить.

                                                                    Это я знаю. Я просто указал на грабли.
                                                                      0
                                                                      1) Оно и так выставлено в 1000.
                                                                      А что такое «еденица»? Не задумывались над тем чтобы подучить русский язык?

                                                                      2) Ну дык проблема где-то между туловищем и клавиатурой.
                                                                    +1
                                                                    смотрите сама возможность создания стека становится возможной благодаря тому только что есть непрерывно работающий воркер который в конце работы не должен скидывать статистку.

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

                                                                      Вы знаете, я ни чего ещё не решил. Но решу сегодня. Когда погоняю утилиту AB сам. Поскольку мусье разработчик до сих пор не сумел ответить на данный вопрос. А вы — можете продолжать минусовать в компании с этим мусье :)
                                                                        0
                                                                        Если хотите сделать более реальный тест, то если не в тягость будет :)
                                                                        Поделитесь результатами его работы (можно в личку).
                                                                          0
                                                                          я кстати вообще не дергаю ни + ни минус ибо глупо — истиный критерий только суть написанного. Прогоните конечно и поделитесь плиз мне вот будет интересно.
                                                                0
                                                                Вообще-то, Opcode-кеш (например, eAccelerator) кеширует лишь результат преобразования исходника в Opcode'ы движка Zend Engine. Всё равно инициализация классов, объектов, и всего прочего будет занимать прилично процессорного времени.
                                                                  +2
                                                                  Более того, если посмотреть исходники eAccelerator, то видно, что он, фактически, сериализует опкод в некоторое свое потоковое представление (которое может еще и gzip-ом жать зачем-то, если его попросить), а при запуске скрипта — обратно распаковывает из сериализации во внутренние PHP-структуры. Вот на эту распаковку и тратится куча времени. Так что кэширование там не очень честное (хотя и дает большой прирост, особенно если все файлы склеить в один — почему, пока непонятно).
                                                                    0
                                                                    исходник не смотрел учту спасибо за инфу.
                                                                0
                                                                так теперь все в свои хуки СВН будут писать не только выгрузку файлов но и реинициализацию воркеров =)
                                                                  +1
                                                                  А смысл? Поддерживается автоматическое обновление по mtime ;-)
                                                                    +2
                                                                    а ну вот уже пошли фичи, чтож давай стабильную версию скорее и будем тестить ее повесив на *nginx на каком нибудь слабеньком VDS и посмотрим результаты
                                                                      0
                                                                      Дык уже можно тестить.
                                                                      Нестабильная версия не означает что всё вдруг начнет глючить и падать, это означает что я пока не готов нести ответственность за применение продукта на продакшене.
                                                                        +3
                                                                        А на стабильной — готовы? А какого рода ответственность?
                                                                          +2
                                                                          ну давайте не будем играть словами =)
                                                                            +1
                                                                            Разумеется, готов. Моральную.
                                                                            SLA-договор штука недешевая ;-)
                                                                  • UFO just landed and posted this here
                                                                      +1
                                                                      А Вы порадовали меня не меньше :-) Ведь для человека необходимо знать что плоды его работы востребованы, это чуть ли ни самое важное.
                                                                      Буду ждать отзыв по использованию :-)
                                                                        0
                                                                        отличная разработка. попробую потестировать на 5.3, хочу встроить в наш движок, чувствую, что именно там это сможет сэкономить очень много ресурсов (из-за особенностей архитектуры выигрыш должен быть большим).
                                                                          0
                                                                          Это Вы промахнулись и минусанули родительный комментарий? :-)
                                                                          Кстати говоря, я сам тестирую на 5.3 :-)
                                                                            0
                                                                            неа не я честно! как я могу, проект мне нравится и я уже третий день хочу думаю где выкроить время, чтобы его вплотную исследовать. хочу в блог свой статью написать, если результаты будет интересны
                                                                    • UFO just landed and posted this here
                                                                        0
                                                                        Я бы не хотел этого, с подозрением отношусь к чужому коду, тем более времени у меня хватает на единоличную разработку. Если будет принято решение о вводе в состав разработчиков еще кого-нибудь — внесу в свойствах проекта.
                                                                        Патчи можно мне присылать на мыло и в список проблем на страничке проекта.

                                                                        P.S. В единственном числе =)
                                                                          0
                                                                          Макс, а я тебе давно говорил что будет FastCGI на ПоХаПе, правда я ожидал что это сделает другой человек :).
                                                                            –1
                                                                            А вот скажите — зачем вообще нужен сам протокол FastCGI?

                                                                            Что мешает принимать запросы по HTTP, без лишней прослойки в виде FastCGI?
                                                                              0
                                                                              «Так можно сделать только в простейшем случае, когда используется одна-единственная копия приложения.

                                                                              Если же мы хотим иметь множество копий приложения на разных серверах (а об этом пойдет речь в продолжении статьи), то нам в любом случае понадобится веб-сервер, который будет разруливать запросы по приложениям.»
                                                                              © ivanych — habrahabr.ru/blogs/php/64938/#comment_1812364
                                                                                0
                                                                                Враки. Можно повесить round-robin DNS или вообще BGP заюзать.
                                                                                  +1
                                                                                  Не-не-не, Дэвид Блейн.

                                                                                  Что такое FCGI и как оно используется, я, как Вы догадались, знаю:)

                                                                                  Тут вопрос другой, скорее философский. Мучает меня в последнее время вопрос о том, что, можно же и без FCGI все сделать, просто самому http обрабатывать, вместо веб-сервера. Ну, натурально — что FCGI разбирать, что HTTP — какая, собственно, разница?
                                                                                    –2
                                                                                    Ну можно вообще всё на асме написать = )
                                                                                      0
                                                                                      И да, только сейчас понял — я на тот вопрос, ответ на который Вы процитировали, плохо ответил. Там вопрос как раз и был про выбрасывание прослойки FCGI между приложением и фронтендом, а я чего-то поторопился ответить, не понял сути.

                                                                                      Короче говоря, вопрос сейчас у меня такой — нафига мне FCGI, если я могу между фронтендом и приложением гонять http?
                                                                                        +1
                                                                                        FCGI — бинарный протокол, намного проще чем HTTP, соответственно и работать с ним быстрее и удобнее.
                                                                                          0
                                                                                          ну http разбирать вы можете, но задача будет намного более сложная + вы теряете весь мощный инструментарий веб сервера который уже имеется (выстраивание в очереди и т.п.)
                                                                                          +1
                                                                                          В обработке HTTP не так давно apache имел проблемы — chunked формат не разбирал правильно, а сколько над апачем работали. PHP будет иметь не меньше проблем. Кроме того, надо будет сделать разбор .htaccess — ведь именно он держит от перехода на nginx, значит нужен. Надо убедиться что PHP умеет выполнять больше одного запроса, написать для него тот же набор модулей что сейчас есть для апача. Работы — море, а даже сейчас производительность обработки запросов упирается не в процессор, так что есть ли смысл?

                                                                                          HTTP — это один из уровней, а деление на уровни добавляет надёжности и гибкости.
                                                                                            0
                                                                                            Не, Вы не поняли. Я не предлагаю делать полномасштабный сервер. Apache или nginx остаются как и были, продолжают принимать и отдавать как и раньше. Запросы как и раньше проксируются с фронтенда на бэкенд.

                                                                                            Нужно только отказаться от заворачивания проксируемых запросов в FCGI. Проксировать HTTP без изменений. А на бэкенде разбирать не FCGI, а HTTP.
                                                                                              0
                                                                                              сложно это тупо сложно. FCGI понятнее
                                                                                                0
                                                                                                Чего это вдруг сложно? HTTP ничем не сложнее FCGI. Тем более, что для рядового разработчика вся сложность сводится к подцеплению соответствующего модуля.
                                                                                                  0
                                                                                                  ну сделайте.
                                                                                        +2
                                                                                        Хороший вопрос. С удовольствием отвечу развернуто.
                                                                                        Сервера приложений в подавляющим большинстве случаев синхронны (грубо говоря не могут обрабатывать второй запрос пока полностью не завершен первый), а хорошие веб-сервера — асинхронны (nginx, lighttpd).
                                                                                        Таким образом, если встроить HTTP-сервер в сервер приложения, то я начну скачивать ответ по 1 байту в секунду и 3 мегабайта памяти сервера будут ждать пока я не отключусь или не получу всё что мне причитается! Такую систему будет очень легко за-DoS'ить, и производительностью она не отличается.
                                                                                        В случае с nginx + FastCGI мы сразу же завершаем запрос (сетевой overhead будет лишь в виде очень быстрой доставки данных до nginx), а nginx в свою очередь может отдавать по 1 байту в минуту без какой-либо потери производительности (он тратит на висящий коннект всего несколько байт оперативной памяти). Ну и keep-alive коннекты pool'ить на PHP не с руки…
                                                                                          0
                                                                                          Так в том и суть, чтобы сделать http сервер с мультиплексором. И тут не принципиально http ли это, или FastCGI протокол. Ну возможно бинарная сущность второго, какой-то выигрыш и даст, но зато у первого больше выбор middleware и тулзов вокруг.
                                                                                            0
                                                                                            Это не отвечает на вопрос «Зачем тут FastCGI?». Почему бы не гонять между nginx'ом и приложением просто http, без лишних преобразований http<->fcgi?
                                                                                              0
                                                                                              Там и нет преобразований, веб-серверу даже проще работать с FastCGI.
                                                                                              Особенности протокола дают преимущество. В протоколе есть пакетные потоки STDIN и STDOUT, передаваемые данные инкапсулируются в структуру Record, и из заголовка пакета мы всегда знаем его длину. Между тем, HTTP поточный протокол, без инкапсуляции в пакеты по умолчанию — там это реализовано через chunked encoding, и ничего хорошего это в себе не несет.
                                                                                                0
                                                                                                Ну как это нет преобразований? Фронтенд перегоняет http в fcgi, потом обратно. Зачем этот лишний этап? Спроксировать поток http сразу на приложение будет явно быстрее.
                                                                                                  0
                                                                                                  nginx сначала парсит, а потом уже выдает клиенту снова. Ведь на уровне веб-сервера могут быть условные конструкции, дополнение заголовков и сжатие контента.
                                                                                                    0
                                                                                                    И что? FCGI-то зачем?
                                                                                                      0
                                                                                                      Я лишь указал на то что нет никаких преимуществ в производительности при использовании HTTP вместо FastCGI.
                                                                                                      Однако, при использовании FastCGI, повторюсь, преимущество в его бинарности, пакетности, и универсальности. Кто сказал что FastCGI это протокол только для Веба?
                                                                                            • UFO just landed and posted this here
                                                                                                0
                                                                                                Это не отвечает на вопрос «Зачем тут FCGI». Ровно то же самое можно сделать, передавая от фронтенда к воркерам не FCGI, а HTTP.
                                                                                                  +2
                                                                                                  Уговорил. Пиши phphttp и кидай статью на хабр :-))))
                                                                                                    0
                                                                                                    Да я больше по Perl'у специализируюсь:)
                                                                                                    habrahabr.ru/blogs/perl/52980/

                                                                                                    А тут сомнения меня одолели — зачем я вообще FCGI юзаю? Думаю, вдруг PHP-коллеги знают толковую причину?
                                                                                            • UFO just landed and posted this here
                                                                                                +1
                                                                                                Хотите сказать, Вы — PHP-шник? ;-)
                                                                                                Шучу.
                                                                                                • UFO just landed and posted this here
                                                                                                    +1
                                                                                                    Нет, я — программист. Java, C, ECMAscript, Python…
                                                                                                    • UFO just landed and posted this here
                                                                                                        +2
                                                                                                        та не, он тоже программист, как и вы.
                                                                                                  +1
                                                                                                  видимо вместе в python, java, ruby — там встроенный сервер есть давно
                                                                                                  • UFO just landed and posted this here
                                                                                                      –2
                                                                                                      вы это к чему?
                                                                                                      • UFO just landed and posted this here
                                                                                                        0
                                                                                                        а че не протокол чтоли?
                                                                                                    0
                                                                                                    круто. видел подобный проект, только реализовывался SCGI (который попроще). но там как-то не уживались (как минимум, у меня) несколько воркеров, только один — и вся затея теряла смысл.

                                                                                                    из беглого чтения кода я так понял, что делаем неблокируемый сокет, форкаем детей, а дальше какой ребёнок первым поймает коннект, тот его и обслуживает. правильно?
                                                                                                      0
                                                                                                      Да, совершенно верно.
                                                                                                        0
                                                                                                        а можно ли вам вопрос про квики задать?
                                                                                                          0
                                                                                                          Легко, но лучше не тут, а по мылу или в аську.
                                                                                                    • UFO just landed and posted this here
                                                                                                        0
                                                                                                        Ох уж эти гитовцы… GitHub != DVCS ;)
                                                                                                        • UFO just landed and posted this here
                                                                                                            0
                                                                                                            Дубль 2: git != github
                                                                                                            • UFO just landed and posted this here
                                                                                                                +1
                                                                                                                  0
                                                                                                                  А разница?
                                                                                                                  –2
                                                                                                                  На то, что отождествлять инструмент и хостинг для него — фанатичное ламерство, ничего личного
                                                                                                                  • UFO just landed and posted this here
                                                                                                              0
                                                                                                              Зачем github? Google Code поддерживает Mercurial и уходить никуда не надо %)
                                                                                                              0
                                                                                                              на самом деле реализация это штуки есть давно (вкупе с фтп-сервером), есть и у меня в фремворке но для задач отладки приложения исключительно (запускается в консоли сервер и можно попробовать корректность установки приложения до установки нормального сервера — полный аналог webrick) причина банальна, когда в этом работает мощный фреймворк появляется проблема циклических ссылок вернее их неудаляемости, использование памяти растет ооочень быстро, очень быстро появляются сегфолты (к сожалению опять-же природа любимого пыха когда резко растет число ссылок в памяти), я для себя в частном случае очень бережно слежу за контролем ссылок с своем фреймворке но на сколько знаю этого никто больше не делает по причине не надобности.
                                                                                                              советую сразу ориентироваться на php 5.3 и на его gc (хотя скорость упадет существенно).
                                                                                                              также подтверждаю — скорость обработки запросов получается очень большой, в моем случае 100 кратный прирост на 10 конкурентных потоках ab при использовании eaccelerator/.

                                                                                                              П.С. а как вы контролируете «живость» воркеров? я ничего умнее pid-файлов не нашел но это не надежно в данном случае (смерть по сегфолту мгновенная и безоговорочная ;)) и медленно
                                                                                                                0
                                                                                                                Контролирую сигналами, разумеется.
                                                                                                                  0
                                                                                                                  эээ так а как при сегфолте?
                                                                                                                    0
                                                                                                                    Вы видно не так поняли. Сигналами из master'а к worker'у.
                                                                                                                      0
                                                                                                                      да, я уже посмотрел — периодически проверяете сигналами кто жив — ну что-ж имеет место быть :) жалко что винда в стороне
                                                                                                                        +2
                                                                                                                        Винда в стороне хотя бы потому что в ней нету pcntl и posix :-) Да и думаю бессмысленно заниматься совместимостью.
                                                                                                                          +1
                                                                                                                          не не жалко
                                                                                                                    0
                                                                                                                    В PHP5 можно контролировать и без GC, но нужно писать объектно — что бы деструкторы чистили всё лишнее и делать уничтожение данных приложения — т.е. практически как на C++ писать получить — проинициализировал динамически что-то — не забудь потом убить. Не смотря на то, что у меня нету такого зверства — я именно так и поступаю — чищу после себя всё, прописываю везде деструкторы. Помогает :)

                                                                                                                    А вообще для highload'ов пригодится — я скорее всего это заюзаю даже — есть где :)
                                                                                                                      0
                                                                                                                      это не всегда работает и не всегда можно сделать, кроме того некоторые pecl личат по причине циклических ссылок — самый яркий пример dom
                                                                                                                        0
                                                                                                                        Ясно что нужно аккуратно и внимательно :)
                                                                                                                          0
                                                                                                                          регулярного перезапуска не избежать и еще: не все на fcgi писать нужно
                                                                                                                      0
                                                                                                                      скажите, это можно будет использовать для уже готовых проектов и каких-нибудь CMS (Drupal например — он ужасно много жрет при инициализации), может с минимальными переделками, или тут надо с нуля всё по-новой писать?
                                                                                                                        0
                                                                                                                        Думаю, что можно. Попробуйте.
                                                                                                                          0
                                                                                                                          наверное нада будет немного пропатчить
                                                                                                                        0
                                                                                                                        Тема конечно интересная, но не верю я в стабильность демонов на пхп. Если ребята не забросят проект — обязательно использую стабильную версию, но до неё ещё ой как далеко. Одно дело тестовый процесс живущий час другой, а другое дело высоконагруженный сервер с кучей запросов и необходимостью железного аптайма. Одним словом удачи!
                                                                                                                          0
                                                                                                                          Думаю. стабл будет через пару недель. Какие ребята? Разработчик один =)
                                                                                                                          Зря не верите, всё зависит от программиста, а не от языка. На Сях тоже можно написать то что постоянно падает в корку, и кстати это сделать проще чем на PHP.
                                                                                                                            0
                                                                                                                            Разве не нашлись единомышленники?
                                                                                                                            Си — проверенный язык, там просто так ничего не вылетит, а пхп не заточен на постоянное исполнение. Я уверен, что во время тестирования всплывёт не один баг ядра.
                                                                                                                          0
                                                                                                                          Кстати вопрос насчет количества запрсоов в секунду. Можете привести параметры запуска ab?
                                                                                                                          Ну и конфигурацию железки тоже интересно бы глянуть.
                                                                                                                            0
                                                                                                                            Тоже интересно количество конкурентных запросов.
                                                                                                                            0
                                                                                                                            С php 5.2.10: Fatal error: Call to undefined function pcntl_sigtimedwait() in /usr/local/etc/phpfastcgi/thread.class.php on line 98 :(
                                                                                                                            Только с PHP 5.3.0 работает что ли? :(
                                                                                                                              0
                                                                                                                              Прошу прощенья, дописал требования в статью. Вам необходимо собрать PHP с параметрами '--enable-pcntl' '--enable-shmop' '--enable-sockets'.
                                                                                                                              Работать будет на всех версиях пятой ветки PHP (даже на 5.1 пробовал).
                                                                                                                                0
                                                                                                                                все эти модули стоят, однако ошибку все равно выдает.
                                                                                                                                в справке пхп написано что функция pcntl_sigtimedwait доступна начиная с версии 5.3 вроде
                                                                                                                                  0
                                                                                                                                  Действительно. Жаль, но придётся смириться с >= 5.3, т.к. использование этой функции даёт очень много. Может, оно и к лучшему. Лично у меня от 5.3 только хорошие впечатления.
                                                                                                                                    0
                                                                                                                                    к 5.3 пока к сожалению нет ZendOptimizer-а, Ionсube Loader-а и много чего еще :(
                                                                                                                                      0
                                                                                                                                      ZendOptimizer -> eAccelerator/APC
                                                                                                                                      Ioncube Loader -> phpcompiler.org/

                                                                                                                                      :-)
                                                                                                                                        +1
                                                                                                                                        и как это закодированные зендом скрипты вдруг под АРС смогут запуститься? %)
                                                                                                                                          +1
                                                                                                                                          Понял =) Я сначала подумал он вам нужен в целях оптимизации…
                                                                                                                                +1
                                                                                                                                можно взять модуль pcntl из 5.3, засунуть его в 5.2.10 и пересобрать php (или сделать phpize и собрать отдельно pcntl).

                                                                                                                                изменения в коде модуля pcntl между 5.2 и 5.3 небольшие, так что проблем это вызвать не должно.
                                                                                                                                +1
                                                                                                                                в теме много «разных» комментариев, автор можно в материал добавить «маркетинговую» таблицу сравнение (для общего развития):

                                                                                                                                сравнение разного рода вариантов и реализаций таких как spawncgi (был в lighttpd), PHP-FPM, etc…
                                                                                                                                  +5
                                                                                                                                  Отлично, наконец-то у нас появилась возможность тратить время на поиск memory leaks )
                                                                                                                                    +3
                                                                                                                                    Кстати, раскрою карты. У меня в планах реализация shared object'ов в разделяемой памяти =) Worker'ы смогут общаться между собой и делиться полезными данными, таким образом, например, обновление блока статистики на сайте (выборка из memcached) будет происходить к примеру не чаще раза в 5 секунд, первым воркером который решил это сделать.
                                                                                                                                    Для программиста это будет прозрачно и таких слов как shared memory и семафоры знать ему не потребуется :-)
                                                                                                                                      0
                                                                                                                                      не пали контору! а вообще это идеал.
                                                                                                                                        0
                                                                                                                                        скорее, использовать не потребуется ;)
                                                                                                                                        без таких знаний это горе-прогер :)
                                                                                                                                          0
                                                                                                                                          Да ладно, на яве нормально всё. Без фундаментальный знаний.
                                                                                                                                            0
                                                                                                                                            ага, только потом на выходе получаем чудо-юдо-код :))
                                                                                                                                        0
                                                                                                                                        Круто, конечно же, но рановато, так как в PHP ещё не до конца допилили сборщик мусора, который не слишком приспособлен к долгоиграющим приложениям. Также хотелось бы получить многопоточность, которая пока что возможна только используя mpm_worker + mod_php.
                                                                                                                                          0
                                                                                                                                          А так ли нужна многопоточность? Думаю, важнее неблокируемость, а она на совести программиста.
                                                                                                                                            0
                                                                                                                                            в пхп по определению невозможно создать многопоточность.
                                                                                                                                              0
                                                                                                                                              mpm_worker может создать многопоточность. Да, php об этой многопоточности ничего не известно, но достоинства от многопоточности всё равно видны: уменьшенное потребление памяти. Почему бы тогда и fastcgi этого не сделать? )
                                                                                                                                                0
                                                                                                                                                mpm — это механизм апача, вместо пре-форк использовать треды
                                                                                                                                                к многопоточности пхп отношения не имеет
                                                                                                                                                каждый поток запущенный с пхп жрет минимум 44метра и использование тредов производительность не на много увеличивают
                                                                                                                                                лучший выход — вообще отказаться от апача

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

                                                                                                                                                  0
                                                                                                                                                  >Почему бы тогда и fastcgi этого не сделать?
                                                                                                                                                  средствами пхп это сделать невозможно. ее нет по определению в пхп.

                                                                                                                                                  оборотная сторона многопоточности — это в случае креша одной нити — крешится все приложение. По этому в целях надежности выбирают схемы, где запускаются отдельные процессы.
                                                                                                                                              0
                                                                                                                                              >phpFastCGI — правильная реализация FastCGI, которая позволяет добиться немыслимой производительности.
                                                                                                                                              всякое подобное утверждение должно подкрепляться цифрами и фактами
                                                                                                                                              кроме голословных утверждений с статье ничего нет.

                                                                                                                                                0
                                                                                                                                                Все умерло? :-)
                                                                                                                                                0
                                                                                                                                                PHPFastCGI превратился в phpDaemon (см. коммент выше).

                                                                                                                                                Некоторая информация о попытке применения этого добра — javascript.ru/blog/Ilya-Kantor/True-FastCGI-dlya-PHP-migraciya-testy

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