Пользователь
0,0
рейтинг
13 августа 2013 в 22:48

Разработка → HipHop VM: разведка боем под Debian 7 + Nginx + Symfony2

Последнее время много «шума» вокруг HipHop VM и kPHP: каждый социальный гигант своё детище хвалит. Больше всего интересовала связка, указанная в заголовке. О kPHP что-то говорить ещё рано, хотя уже заранее известно, что ООП не поддерживается. А вот HipHop VM уже можно пощупать. Кто-то об этом звере слышал, некоторые пытались устанавливать, некоторым это удавалось.

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



  1. Условия тест-драйва
  2. Компиляция
  3. Конфигурация и запуск
  4. Настройка Nginx
  5. Сушите вёсла, приплыли
  6. Тесты
  7. Выводы
  8. Заключение



1. Условия тест-драйва

Машина на DigitalOcian за $5/мес:
  • Память: 512 Мб
  • Процессор: 1x 2000 МГц
  • ОС: Debian 7.0 (Wheezy) x86_64
  • Веб-сервер: Nginx 1.2.1
  • SWAP: 500 Мб


2. Компиляция

Устанавливаем HipHop VM из исходников, т.к. актуальных пакетов найдено не было. Автор представленного на GitHub пакета HipHop VM для Debian 7 (Wheezy) больше пакет не поддерживает и его репозиторий недоступен (Если вы знаете, где можно найти пакет HipHop VM под Debian 7 — пожалуйста, отпишитесь в комментариях).

Скачиваем с GitHub исходный код HipHop VM, выставляем переменные окружения и устанавливаем нужные пакеты:
mkdir /opt/dev
cd /opt/dev
git clone git://github.com/facebook/hiphop-php.git

export CMAKE_PREFIX_PATH=`pwd`/..
export HPHP_HOME=`pwd`

sudo apt-get update
sudo apt-get install git-core cmake g++ libboost1.48-dev libmysqlclient-dev \
    libxml2-dev libmcrypt-dev libicu-dev openssl build-essential binutils-dev \
    libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev \
    autoconf libtool libcurl4-openssl-dev libboost-regex1.48-dev libboost-system1.48-dev \
    libboost-program-options1.48-dev libboost-filesystem1.48-dev wget memcached \
    libreadline-dev libncurses-dev libmemcached-dev libbz2-dev \
    libc-client2007e-dev libgoogle-perftools-dev \
    libcloog-ppl0 libelf-dev libdwarf-dev libunwind7-dev subversion


Пакеты php5-mcrypt и php5-imagick, которые упоминают мануалы не ставим, т.к. нам они не нужны.

Устанавливаем сторонние программы, которые понадобятся при компиляции и по ходу патчим libevent патчем от HipHop VM:
# libevent
git clone git://github.com/libevent/libevent.git
cd libevent
git checkout release-1.4.14b-stable
cat ../hiphop-php/hphp/third_party/libevent-1.4.14.fb-changes.diff | patch -p1
./autogen.sh
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

# curl
git clone git://github.com/bagder/curl.git
cd curl
./buildconf
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

# glog
svn checkout http://google-glog.googlecode.com/svn/trunk/ google-glog
cd google-glog
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

# jemaloc
wget http://www.canonware.com/download/jemalloc/jemalloc-3.0.0.tar.bz2
tar xjvf jemalloc-3.0.0.tar.bz2
cd jemalloc-3.0.0
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

# libunwind
wget 'http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz'
tar -zxf libunwind-1.1.tar.gz
cd libunwind-1.1
autoreconf -i -f
./configure --prefix=$CMAKE_PREFIX_PATH
make install
cd ..

# удаляем лишнее
rm -rf libevent curl google-glog jemalloc-3.0.0.tar.bz2 jemalloc-3.0.0 libunwind-1.1


Обратите внимание, что была установлена libunwind версии 1.1. С версией 1.0., которую советуют в мануалах, cmake падает с ошибкой.

Запускаем утилиту cmake:
cd hiphop-php
# ещё раз выставляем HPHP_HOME, иначе - ошибка
export HPHP_HOME=`pwd`
cmake -D CMAKE_PREFIX_PATH=/opt/dev .


В параметре CMAKE_PREFIX_PATH передаём директорию, в которой находится папка hiphop-php с исходными кодами HipHop VM, иначе cmake падает с ошибкой (в мануалах об этом умалчивается).

Скрестив пальцы, запускаем компиляцию:
make

Через несколько минут компиляция падает примерно с такой ошибкой:
[ 46%] Building CXX object hphp/CMakeFiles/hphp_runtime_static.dir/runtime/vm/bytecode.cpp.o c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.
make[2]: *** [hphp/CMakeFiles/hphp_runtime_static.dir/runtime/vm/bytecode.cpp.o] Error 4
make[1]: *** [hphp/CMakeFiles/hphp_runtime_static.dir/all] Error 2
make: *** [all] Error 2


Удаляем файл /opt/dev/hiphop-php/CMakeCache.txt, увеличиваем файл подкачки до 1 Гб и повторно выставляем переменные окружения:
export CMAKE_PREFIX_PATH=`pwd`/..
export HPHP_HOME=`pwd`

Повторно запускаем make и ждём часа полтора…

3. Конфигурация и запуск

Создаём минимальный файл конфигурации HipHop VP примерно следующего содержания:
/opt/dev/hiphop-php/config.hdf
PidFile = /run/hiphop.pid

Server {
  # Порт, по которому будем обращаться к виртуальной машине
  Port = 4849
  # Путь к домашней директории проекта
  SourceRoot = /var/www/www.mysymfony2site.com/web/
}
# Виртуальный хост, который перенаправляет запросы на app.php
VirtualHost {
  * {
    Pattern = .*

    RewriteRules {
      * {
        pattern = .*
        to = app.php
        qsa = true
      }
    }
  }
}


Запустить HipHop VM как демона можно следующей командой:
/opt/dev/hiphop-php/hphp/hhvm/hhvm --mode daemon --config /opt/dev/hiphop-php/hphp/config.hdf

Мы же запускаем сервер HipHop VM в консоли, чтобы на время отладки в реальном времени видеть все его «матюки»:
/opt/dev/hiphop-php/hphp/hhvm/hhvm --mode server --config  /opt/dev/hiphop-php/hphp/config.hdf


4. Настройка Nginx

В локейшене Nginx, отвечающем за обработку динамики проксируем запрос на HipHop VM:
location ~ ^/(app|app_dev|config)\.php(/|$) {
    # Передача запроса HipHop VP
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header Host $host;
    proxy_pass   http://localhost:4849;
}

5. Сушите вёсла, приплыли

Открываем страницу конфигурации Symfony2 www.mysymfony2site.com/config.php и видим несколько проблем и рекомендаций:



Отсутствует расширение intl, которое для нас критично. Найти способ доставить его не удалось (возможно, вы по этому поводу что-то подскажете).

Идём дальше и открываем основной сайт www.mysymfony2site.com и видим в открытой консоли сервера HipHop VP следующее сообщение об ошибке:
request.CRITICAL...
request.CRITICAL: Doctrine\ODM\MongoDB\Mapping\MappingException: No identifier/primary key specified for Document 'Project\MyBundle\Document\Visitor'. Every Document must have an identifier/primary key. (uncaught exception) at /var/www/www.mysymfony2site.com/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/MappingException.php line 94 [] []
request.CRITICAL: Exception thrown when handling an exception (Doctrine\ODM\MongoDB\Mapping\MappingException: No identifier/primary key specified for Document 'Project\MyBundle\Document\Visitor'. Every Document must have an identifier/primary key.) [] []


О том, что HipHop VP не поддерживает аннотации было известно, но попытаться было решено по следующим причинам:
  • Известно, что Symfony2 при очистке кэша его же и подогревает. Очищается кэш из консоли без обращения к HipHop VM обычным PHP 5. Т.е. была надежда на то, что Symfony2 при очистке кэша закэширует все аннотации и при обращении к app.php возьмёт их из файлов кэша, подготовленных PHP 5.
  • А вдруг.

К сожалению, надежды не оправдались. Возможно, с будущими релизами ситуация изменится.

6. Тесты

Раз уж так вышло, что HipHop VM взлетел, но без Symfony2 на борту, было проведено небольшое тестирование. Скрипт и параметры нагрузки взяты из топика трёхлетней давности, посвящённого HipHop-PHP. Условия проведения и объекты тестирования, конечно, отличаются, но всё же, любопытства ради…
test.php
<?php
for($i = 0; $i < 1000; $i++) {
    echo var_dump($_SERVER);
}


Возможность влияния БД, на которую часто ссылаются разработчики HipHop VM, исключена. Обращения будут выполняться через Nginx для большей приближенности к реальности:
ab -n 1000 -c 5 http://www.mysymfony2site.com/test.php

HipHop VM
Concurrency Level:      5
Time taken for tests:   24.912 seconds
Complete requests:      1000
Failed requests:        97
   (Connect: 0, Receive: 0, Length: 97, Exceptions: 0)
Write errors:           0
Total transferred:      1588072000 bytes
HTML transferred:       1587891000 bytes
Requests per second:    40.14 [#/sec] (mean)
Time per request:       124.558 [ms] (mean)
Time per request:       24.912 [ms] (mean, across all concurrent requests)
Transfer rate:          62254.02 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       7
Processing:    44  124  26.9    120     268
Waiting:       38  103  23.5    101     231
Total:         44  124  26.9    120     268

PHP5-FPM+APC
Concurrency Level:      5
Time taken for tests:   387.404 seconds
Complete requests:      1000
Failed requests:        85
   (Connect: 0, Receive: 0, Length: 85, Exceptions: 0)
Write errors:           0
Total transferred:      4263063000 bytes
HTML transferred:       4262907000 bytes
Requests per second:    2.58 [#/sec] (mean)
Time per request:       1937.018 [ms] (mean)
Time per request:       387.404 [ms] (mean, across all concurrent requests)
Transfer rate:          10746.28 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0      10
Processing:  1163 1936 214.5   1865    3365
Waiting:        1   11  63.6      3    1371
Total:       1163 1936 214.6   1865    3365


7. Выводы

Смотрим результаты тестов, делаем выводы.

8. Заключение

Всем спасибо, удачи с прикручиванием HipHop VM к вашим проектам.
Ваше отношение к HipHop VM

Проголосовало 758 человек. Воздержалось 240 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

@transpond
карма
28,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (65)

  • +1
    Может вы бы сразу и пакет собрали под Дебиан?
  • +7
    Для тех кто дружит с английским, советую посмотреть выступление Andrei Alexandrescu: The Hip Hop Virtual Machine.
    vimeo.com/68383350

    Александреску рассказывает об интересных моментах перехода HipHop на виртуальную машину, и о разных методах оптимизации.

    Например, так как у PHP отсутствует строгая типизация, HipHop не может заранее знать какой тип возвратит функция. У этой проблемы нашлось оригинальное решение — HipHop пытается угадать тип по названию функции. Например если функция называется getName, скорее всего возвращается строка.
    В видео говорится, что тип успешно угадывается в 99% случаях.
    • +37
      o_O какой эпичный костыль.
      • +5
        Если это глупо, но работает, значит — это не глупо. ©
        • +8
          Хотите сказать, работающий говнокод — это не глупо?
          • +5
            В подавляющем большинстве случаев, рабочий говнокод — это профит.
            А вот вылизывать неделями код, теряя драгоценное время и деньги — это глупо.
            Сам я умом это прекрасно понимаю, а вот на практике не могу переступить через себя. :(
            • 0
              Если «работающий говнокод» решает проблему быстро, сейчас, и в будущем в это место никто лезть не собирается — то оправдание такому подходу еще можно найти.
              А если же вы «сейчас» пишете говнокод — который завтра и послезавтра нужно поддерживать и править, то тут уж никакие отговорки, либо «качественно» либо никак.
              И еще есть такая умная мысль — Долгоиграющий продукт делать правильно и качественно намного дешевле.
              • 0
                Вы абсолютно правы, но лишь при условии что случай идеальный.
                Если я буду быдлокодить, абы работало, я запущу 10 проектов. Из 10-ти проектов взлетит один. Потрачу на все это год, но получу взлетевший проект. Дальше я его могу сам или же наняв кого-то, довести до ума или даже переписать с нуля уже нормально. В результате у меня будет взлетевший проект и профит.
                Либо, я буду год вылизывать проект, запущу — не стреляет. Следующий — не стреляет. Спустя 10 лет, я делаю тот самый стрельнувший проект, но где мое время?

                Ситуация двойственная, дилемма имеет исключения, однако в общем случае с точки зрения выгоды, именно быдлокодить выглядит более разумно.
          • +4
            HipHop — не транслятор сферического кода в вакууме.
            Он создан для запуска реального, существующего PHP кода, который не был предназначен для скорости.
            И если такой костыль работает, то есть сухие цифры показывают что с ним быстрее чем без него, то почему бы его не использовать?

            В общем, в Фейсбуке согласны что PHP далеко не идеальный язык, но код уже написан и деваться некуда.
      • 0
        Не костыль, а спекуляция для оптимизации. Посмотрите вот на этот слайд. К сожалению, пдф с этой презентацией сходу найти не смог.
    • +5
      А не лучше ли тут использовать phpdoc и его @returns. Странное решение.
      • +2
        Так это нужно для всех функций @returns дописывать.
        Цель HipHop запускать PHP, каким бы он ни был.
        • +4
          Человек говорит все же о том, что часто код документирован и довольно глупо не проанализировать аннотации и на их онсове уже гадать.
        • 0
          Да, как написал WaveCut, я имел ввиду, что сейчас уже сложно найти качественный код без аннотаций у каждой функции/поля, либо без возможности вывода типа исходя из кода.

          Мне видится очень кривым решение анализировать имена методов. Хотя, если у них там используется вариация польской нотации (sGetName/getNameString, iCount/countStr, ...), то почему бы и нет.
          • 0
            Бессмысленные очевидные комментарии уже являются атрибутом качественного кода.
            Куда вы катитесь, хабракомментаторы.
            • +2
              Значит, указывать @params, @returns, @throws это уже бессмысленно?
              • 0
                Комментарии пишутся для людей.
                Если ваша религия требует заниматься javadoc-извращениями, это не значит что все должны ей следовать.

                Например, для getEmailById() состоящей из 2-х строк бессмысленно указывать то, что вы перечислили.
                • +1
                  Комментарии пишутся для людей, если имя метода/функции/etc не дает точного понимания, чего она делает (не обсуждаем сейчас рефакторинг этого случая).

                  А тот же @ returns часто полезен именно для IDE, если она не может корректно вывести типы.
                  Аналогично указание @ param поможет IDE ругаться, если в вызов передается не тот тип данных.
                  • –2
                    А если кто-то использует Vim или Sublime вместо IDE?
                    Зачем им ваши IDE?
                    • +1
                      Вообще вижу, что под vim и sublime есть phpdoc. Почему бы не использовать?
                      Аннотации типов, поверьте, экономят время и уменьшают вероятность ошибки.
                • +4
                  А Email это строка или объект класса Email? А что будет если функция не найдет емайл? Исключение, null, false? А какого типа параметр нужно передавать? Число, строка, объект? Анотация позволит ответить на все эти вопросы не анализируя код функции, а если он состоит из 2 строк, значит нужно будет лезть вглубь кода и анализировать его.
                  • –5
                    > А Email это строка или объект класса Email?
                    > А какого типа параметр нужно передавать?

                    А зачем это знать?
                    Пишите код так, чтобы было все равно.

                    > А что будет если функция не найдет емайл?

                    Значит она не вернет email.

                    > Анотация позволит ответить на все эти вопросы не анализируя код функции

                    А кто сравнивал затраты на написание аннотаций для _всех_ функций в проекте по сравнению с тем, чтобы заглянуть код в редкие моменты, когда нужно такие мелочи прояснять?
                    • +1
                      Пишите код так, чтобы было все равно.

                      switch (gettype($email)) {
                          case 'string':
                              break;
                          case 'integer':
                              $email = new Email($email)->getEmail();
                              break;
                          case 'array':
                              // несколько email передано. где же Composite?
                              break;
                          case 'object':
                              if ($email instanceof Email) {
                                  $email = $email->getEmail();
                              }
                          ...
                      }
                      

                      Ага, пошел переписывать.

                      Значит она не вернет email.

                      А что тогда она вернет? Ничего не вернет? А может она бросит исключение?

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

                      Вписать в автоматически созданную заготовку phpdoc блока типы значений — дело считанных секунд. А сэкономит это потом и вам и другим разработчикам кучу времени.
                      Вы писали много кода с использованием сторонних больших библиотек? Особенно используя что-то в первый раз.
                      • 0
                        >>new Email($email)->getEmail()
                        не хорошо вышло. но это была передача сути
                        • 0
                          new Email((int)$email)->getEmail()
                          Так понятнее?
                          • 0
                            Так email и так типа integer, мы же уже в соответствующем case.
                      • –2
                        PHP — это язык программирования без строгой типизации.

                        В нем в большинстве контекстов нет разницы между 1 и «1».

                        И никто по этому поводу не поднимает бучу, кроме любителей джавы, которые на php пишут как на джаве.

                        > А что тогда она вернет? Ничего не вернет? А может она бросит исключение?

                        А что возвращает strpos когда оно ничего не находит? Вы каждый раз в мануал лезете, чтобы это узнать?

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

                        > Вписать в автоматически созданную заготовку phpdoc блока типы значений — дело считанных секунд.

                        Плюс еще время при каждом изменении функции.
                        Плюс загромождение кода этим мусором — код распухает.

                        > А сэкономит это потом и вам и другим разработчикам кучу времени.

                        Как вы это считали? Мне мой код понятен без комментариев спустя несколько лет.

                        > Вы писали много кода с использованием сторонних больших библиотек?

                        Мое впечатление от javadoc «документации» — это формальная отписка, требовалась документация — нате вам документацию.
                        • +1
                          Вообще, мы уже совсем не о теме поста общаемся. Но все-же отвечу, в последний раз.

                          в большинстве контекстов нет разницы между 1 и «1».

                          Если мы в new Email() передали «1», то что это? Кривой строковый email или числовой id, по которому нужно выбрать данные из БД?

                          А что возвращает strpos когда оно ничего не находит?

                          Наверное === и !== придумали и успели добавить в PHP больные психически люди до того, как их поймали и не дали добавить еще и ====.
                          Возможность вернуть null, false или 0 и всё это различать — это полезный, хоть опасный инструмент.
                          В C strpos вернет или адрес символа или NULL. Но нам адреса не даны и возможность отличить false от 0 приходится кстати.

                          Вы каждый раз в мануал лезете, чтобы это узнать?

                          А как вы используете язык, если не знаете, как он работает? Переписываете код, пока он не заработает как ожидалось (пройдет тесты, написанные кем-то еще)? Этакий метод Монте-Карло.

                          Что возвращать, кидать ли исключение — это договоренность, которую можно описать 1 раз...

                          А если исключение, то какое именно? Или нужно ловить все Exception, чтобы наверняка? В python вон pycharm вообще по рукам бьет за ловлю главного Exception)

                          Плюс еще время при каждом изменении функции.
                          Плюс загромождение кода этим мусором — код распухает.

                          Я чаще вызываю функции/методы, чем переписываю их внешний интерфейс и реализацию :)
                          Размер — вообще не довод в пропивопославление получаемого удобства. Тем более любой редактор, чуть сложнее cat (утрирую конечно) умеет сворачивать комментарии.

                          Как вы это считали?

                          Опыт. Вот, например, если некая общая для нескольких подпроектов библиотечка на 573 метода в куче классов, с группировкой по категориям (namespace или Zend-style не важно). Это лишь небольшая часть всей системы, которая пишется несколькими людьми. И как классно, нажав Ctrl+Q на непонятном/подзабытом методе, увидеть как с ним взаимодействовать как с черной коробкой без необходимости лезть в его реализацию.

                          требовалась документация — нате вам документацию

                          Для меня doc-блоки в первую очередь — это помощь при написании кода. Например для той либы на 500+ методов сгенерированной по phpdoc-блокам документации нет. И не нужна она такая. Не затем комментарии пишутся.

                          Если вы пишете небольшой код для личного использования — ну и ладно. А вот при работе в команде…
                          Можно вспомнить одну известную фразу:
                          Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.


                          Давайте закончим это холивар в данном посте, в котором речь о другом совсем. Если хочется продолжить — если личка и нерабочее время.
                          • 0
                            > Вообще, мы уже совсем не о теме поста общаемся. Но все-же отвечу, в последний раз.

                            Как раз таки по теме поста и общаемся.
                            Вы предлагаете превратить PHP в строго типизированный язык, вообще отрицая нестрогую типизированность как таковую.

                            Но можете не отвечать, да, тут и так все понятно.

                            > Если мы в new Email() передали «1», то что это? Кривой строковый email или числовой id, по которому нужно выбрать данные из БД?

                            Не знаю, откуда вы вытащили new Email().
                            Речь шла о getEmailById()

                            Если вы уж так хотите new Email(), у аргументов есть имена.
                            $id — это id, $email- это email.

                            (знаю, сейчас начнется буквоедство. Что такое email можно описать для всего проекта сразу, а не для каждой функции).

                            > В C strpos вернет или адрес символа или NULL. Но нам адреса не даны и возможность отличить false от 0 приходится кстати.

                            Спасибо, КО.
                            Вот примерно тоже самое будет и для getEmailById(). И не надо это к каждой функции в комментарии писать — это задается для всего проекта.

                            > А как вы используете язык, если не знаете, как он работает?

                            Обычно в хорошей документации есть общее описание подобных вещей на человеческом языке.

                            > А если исключение, то какое именно? Или нужно ловить все Exception, чтобы наверняка?

                            Если непонятно — пишите комментарий // кидает MyException.
                            Если это очевидно из кода — ничего не пишите.

                            > Размер — вообще не довод в пропивопославление получаемого удобства.

                            Нет никакого удобства в тупом описании очевидных вещей по 100 раз.

                            > Тем более любой редактор, чуть сложнее cat (утрирую конечно) умеет сворачивать комментарии.

                            Так вот для чего нужны навороченные редакторы :)
                            Они научились уже автоматом сворачивать ненужные комментарии?

                            > Опыт

                            У меня опыт противоположный. Разработчиков api, которыми пользуюсь, иногда прошу меньше внимания уделать документации, потому что там все очевидно.

                            > Для меня doc-блоки в первую очередь — это помощь при написании кода.

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

                            > Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.

                            Спасибо, не надо мне давать таких советов. Я — владелец своих проектов. И лучше знаю как расставлять свои приоритеты.

                            > речь о другом совсем

                            Речь шла о том, как ускорить PHP.
                            Люди из Facebook успешно это делают.
                            Но тут вылезли хабракомментаторы «Вот дураки, нет чтобы PHP превратить в строго типизированный язык».
                            • 0
                              Эх, еще коммент.

                              Необходимость залезть в функцию и посмотреть ее реализацию — это смена контекста и потеря времени.
                              Работа с doc-блоками и blackbox методами позволяет держать в голове более высокий уровень абстракции проекта. Более того, держать нужный сейчас уровень, а не (все?) нижележащие.

                              Про все прочее не хочу отвечать, хоть и есть несколько фраз, которые очень хочется прокомментировать. Вам и так минусуют, может они еще и отпишутся.

                              Разве что заступлюсь за vim. Вы не поверите, но он умеет сворачивать комменатрии :)
                              • –3
                                Да не отвечайте, вы все равно слабо представляете о чем спорите.
                                Объясню:

                                Вы устроили холивар на тему «Строгая Типизация» vs «Недоязыки вроде PHP».

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

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

                                > Разве что заступлюсь за vim. Вы не поверите, но он умеет сворачивать комменатрии

                                Ох, правда что ли? :) Спасибо, КО. Я им лет 10 пользовался, как бы в курсе.

                                P.S.
                                Самый прикол в том, что хабрахомячки весь этот бред еще и плюсуют.
                          • 0
                            В python вон pycharm вообще по рукам бьет за ловлю главного Exception)
                            Классная фишка, блин!
                      • 0
                        switch (gettype($email)) 
                        

                        самый волнующий момент
    • +3
      «Не назывый функцию getPhone, называй getPhoneNumber — тогда HipHop лучше тип угадает» или «вот тебе таблица английских слов — эти 300 для string, эти 250 для integer и что бы до завтра все выучил» — это трындец… Не проще ли тогда на языке с типизацией писать?
      • –3
        Нет.
      • +1
        прочитайте слайд выше. он изначально ничего про имена не знает, он гоняет проект и запоминает что встречает в проекте.
        когда встречает незнакомый ранее метод, он по истории ищет такое имя и берет тип оттуда.
    • 0
      Как по мне, так довольно странное решение. Могли бы возвращать некий object, который внутри содержит знание о том, какого он типа, в том числе базовые строка, число. Когда код написан с правильным предположением о значении — то одна лишняя проверка вообще ничего не стоит, а уж если надо конвертировать, то тут в любом случае проверять придётся. Они же в любом случае должны были делать сборщик мусора, то есть уже нужен какой-то счётчик ссылок или ещё какая-то конструкция. Видимо, это тяжёлое наследие оригинального HipHop.
      • +3
        Вуаля! Получаем все тот же Zend Engine, но сбоку!
        • +1
          Нашёл.

          В общем, конечно они держат тип внутри объекта. Но каждый блок кода транслируется в несколько разные бинарные tracelet, как они их называют, которые различаются типами входных объектов. И вот тут как раз работает спекуляция, основанная на имени функции. Можно узнать немножко информации тут: qconsf.com/sf2012/dl/qcon-sanfran-2012/slides/KeithAdams_PHPOnTheMetalWithHHVMMOVEDTOBALLROOMBC.pdf
          Есть ещё корявые слайды webcache.googleusercontent.com/search?q=cache:Qpr4ZvKkrWwJ:www.ssrg.nicta.com.au/summer13/Adams.pdf+&cd=2&hl=ru&ct=clnk&gl=ru
      • 0
        В PHP всё именно так и происходит. Вероятно хотели что-то другое.
  • 0
    А я вот не очень понял, симфони же можно использовать без аннотаций, конфиги в yaml писать например. Даже framework-standard-edition не запустился?
    • 0
      насколько я понимаю оно не поддерживает неймспейсы.
      • 0
        оО… статический анализатор кода сделать смогли, а простейший механизм неймспейсов — нет… странно.
        Получается они на уровне php 5.2… надо бы кохану попробовать запустить
  • +14
    Что, серьезно, это тот самый и единственный тест, который вы провели?

    <?php
    for($i = 0; $i < 1000; $i++) {
        echo var_dump($_SERVER);
    }
    

    Даже как-то не смешно.
  • +1
    А попробуйте ка в случае с PHP5-FPM+APC выставить apc.stat в «Off».
    • 0
      Помилуйте, каждый запрос с PHP5-FPM+APC выполняется почти 2 секунды. Неужели stat к одному единственному файлу может занимать хоть сколько-либо сравнимое с этим время.
      • 0
        Случается, что поведение APC очень сильно зависит от файловой системы.
    • 0
      Стат выполняется раз в секунду, насколько я помню, по-умолчанию.
  • 0
    кто хочет поюзать на Красных Шапках 6 — ставим EPEL и идём качать 198.204.229.178/forgottenbooks.repo
    Только что собрал пакет из Hiphop-php транка.

    Сервак простоит скорее всего не очень долго, заказчик юзает его для какой-то своей очень временной цели.
    В приципе можно wget'ом рекурсивно выкачать контент и поднять у себя (createrepo --update /path/to/RPMS/) -на сейчас там всего чуть более 700Мб.

    Да, кстате. Есть поделка от индуса, но в ней столько г… внутри.
    Для тех, кто сильно параноидальный может взять SRC RPM, перекачать зановол сорцы и собрать ручками.
    Я потратил на секс 14 часов.
  • 0
    Для меня самый главный недостаток hiphop — нет поддержки mysqli.
    • 0
      а какой тогда в нем смысл?
      • +2
        Видимо смысл в использовании PDO
  • 0
    А зачем от тогда нужен, раз на реальных проектах не взлетает? Чисто что бы убедится, что от 0 до 10000 на С считается быстрее? Хотелось бы почитать про удачный опят использования HipHop, если такой у кого-нибудь был.
    • +1
      facebook.com?
      • +1
        Ну так под него и писалось. Имеется ввиду любой другой проект переведенный на HipHop после написания.
    • +1
      Насколько я понимаю, для очень больших проектов имеет смысл писать код под HipHop VM (либо идти на компромиссы, как минимум), т.к. результаты бенчмарка серьезные…
      • +2
        Для очень больших проектов вообще надо заранее думать, писать ли код на PHP. Я не хейтер PHP, я сам на нем работаю, но все эти костыли… И потом, результаты бенчмарка в высшей степени сомнительны, т.к. даже отдаленно не отражают суть.
      • 0
        Очень большие проекты часто и написаны чуть ли не в процедурном стиле времен PHP 3 или 4 (впрочем часто они и писались в те времена) и это только ускоряет их (смотрю на некоторые исходники OpenX). И думается мне, что HipHop VM для них как раз таки подойдет в лучшем виде
  • 0
    использовать симфони в проектах с высокой нагрузкой — это уже извращение.
    >Requests per second: 40.14 [#/sec] у меня почти в два раза меньше показывает и без HipHop

    в целом статья хорошая — спасибо за грабли, хотя у каждого они свои, но всё же — постараюсь не наступать…

    давно собирался перевести часть проектов на HPHP
  • +1
    Настораживает
    Failed requests: 97
    Это при малом времени обработки запросов и больше, чем для классического PHP
    • 0
      А строчкой ниже указана причина привала запросов: несовпадение длины. Так что на самом деле в обоих случаях проваленных запросов нет.
  • +2
    Меня одного смущает в этом тесте размеры ответов различаются в 2,68 раза?
    • 0
      Вы представляете какие будут результаты если добавить в тест Apache+modPHP и чуточку поправить test.php?

      <?php
      if ($_SERVER['SERVER_SOFTWARE']=='Apache') {
          echo 'mod_php is still cool';
      } else {
          for($i = 0; $i < 1000; $i++) {
              echo var_dump($_SERVER);
          }
      }
      
  • –1
    Фигня какая то по результатам тестов, почему такая большая разница по полученным данным?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.