«Наша цель заключается в том, чтобы действительно заставить PHP работать быстро», – указал руководитель группы инженеров Facebook Джоел Побар. В этом году на всех серверах Facebook была установлена виртуальная машина HipHop Virtual Machine (HHVM).
HHVM – уже не первая попытка Facebook добиться ускорения выполнения кода PHP. Язык PHP является интерпретируемым, то есть его исходный код обрабатывается напрямую. В общем случае, программы, написанные на интерпретируемых языках, выполняются не так быстро, как программы на Си или C++, которые предварительно переводятся на машинный язык компилятором. Facebook сохраняет приверженность PHP, потому что этот язык хорошо знаком большинству веб-программистов, работающих в компании.
Для удовлетворения растущих потребностей пользователей в Facebook ранее был разработан компилятор HipHop, осуществляющий перевод кода PHP на язык C++. После этого код C++ компилируется, благодаря чему достигается увеличение быстродействия.
Несмотря на то что в Facebook были довольны значительным приростом производительности, который на протяжении нескольких лет обеспечивала первая версия HipHop, в компании продолжали искать и другие способы ускорения передачи динамически создаваемых веб-страниц миллиарду своих пользователей. «В нашей стратегии повышения производительности постоянно происходят какие-то изменения», – подтвердил Полар.
Следующим шагом стало проектирование HHVM. Виртуальная машина, на создание которой ушло три года, работает по тому же принципу, что и виртуальная машина Java (JVM). В состав HHVM входит JIT-компилятор (Just In Time), который по мере необходимости на лету переводит исходный код, написанный человеком, в байт-код, читаемый машиной. (От использования предыдущей версии HipHop, переименованной в HPHPc, в Facebook решено отказаться.)
«Компиляция на лету позволяет виртуальной машине принимать оптимизирующие решения непосредственно в процессе выполнения кода, – пояснил Полар. – К примеру, если базе данных MySQL передается запрос на считывание строки данных, HHVM может на лету определить, к какому типу эти данные относятся (например, являются ли они целочисленными или строковыми). После этого опять-таки на лету генерируется код, который лучше подходит для обработки конкретного типа данных».
Старая версия HipHop анализировала кодовую базу Facebook и формировала специализированный код по результатам этого анализа. Но она не могла принимать все решения самостоятельно. В кодовой базе присутствовали части, анализ которых был запрещен.
По оценкам Побара, HHVM работает примерно в два раза быстрее HPHPc и в девять раз быстрее чистого PHP.
Код HHVM был помещен Facebook на сервис GitHub в надежде на то, что им воспользуются и другие разработчики, желающие ускорить функционирование своих сайтов PHP.
Виртуальная машина HHVM оптимизирована для управления очень большими и загруженными кодовыми базами PHP. По оценкам Побара, использование HHVM на сайтах стандартных размеров (например, на блог-хостинге Wordpress) дает только пятикратный прирост производительности.
«Если взять код PHP и запустить его в HipHop, время обработки кода процессором не будет фактором, сдерживающим производительность, – указал он. – Основные затраты здесь связаны с обращением к базе данных и буферной памяти».