Статьи

PHP в поисках производительности: от C до HHVM

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

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

Происхождение PHP

В 1994 году Расмус Лердорф захотел более простой способ показать свое резюме пользователям Интернета и отслеживать трафик на него. В то время веб-разработка велась путем написания CGI-программ на C, что могло быть утомительно и требовало знания многих низкоуровневых концепций, таких как ручное управление памятью . И поэтому Расмус начал работу над тем, что должно было стать PHP .

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

Компиляторы, такие как компилятор C, который Rasmus использовал для построения PHP, основываются на этом, принимая код, написанный на языке более высокого уровня, и преобразуя его в двоичный файл для конкретного процессора. Эти инструменты позволяют языкам программирования быть более понятными для человека, что, в свою очередь, позволяет выполнять более сложные задачи с меньшим количеством кода, чем требуется для сборки, и позволяет компилировать один и тот же код для нескольких процессоров с разными наборами команд.

Сам PHP несколько отличается: это интерпретируемый язык, а не компилируемый язык, такой как C. Вместо компиляции вашей программы интерпретатор PHP компилируется для конкретного процессора вашего сервера, и этот интерпретатор выполняет вашу программу. Этот уровень абстракции имеет то преимущество, что позволяет вам запускать ваш PHP-код без его компиляции . Эта та же самая способность рекламировалась как преимущество Java , которое появилось год спустя в 1995 году с фразой «пиши один раз, беги куда угодно».

Интерпретируемые языки не обходятся без затрат. Скомпилированные программы работают быстрее, потому что они существуют как инструкции, которые процессор может понять непосредственно. По сути, переводчики должны реализовывать функцию аппаратного обеспечения процессора как программное обеспечение. Например, интерпретатор PHP преобразует код PHP в коды операций , эквивалентные ассемблеру, и выполняет их. По этой причине переводчиков часто называют виртуальными машинами ; подобно (системным) виртуальным машинам, которые вы используете для запуска гостевой операционной системы внутри хост-операционной системы, они являются абстракцией внутри абстракции, которая предлагает удобство в обмен на производительность. В случае с PHP Zend Engine (1.0 в PHP 4, 2.0 в PHP 5) является его виртуальной машиной. Здесь начинается наша история.

Будет ли это компилироваться?

Человек по имени Пол Биггар решил изучить этот вопрос с помощью PHP. Он присоединился к проекту phc в 2006 году с целью перевести PHP в эквивалентный код на C, который затем может быть скомпилирован в собственный код. Его разработка продолжается и сегодня, хотя релизы не очень часты.

Вскоре после того, как Пол начал свои усилия, в начале 2007 года Roadsend начал проект с аналогичными целями под названием pcc, который впоследствии был изменен на rphp или Roadsend PHP. Однако на момент написания этой статьи проект не видел коммитов примерно год . Его форумы поддержки все еще видят случайные сообщения, но большинство из них указывают, что работа с Roadsend довольно хлопотна. IRC-канал проекта также неактивен.

Существуют другие проекты, которые переносят некоторую форму PHP на аналогичную платформу: Phalanger запускает его на .NET CLR, а Quercus и Project Zero запускают его на Java JVM . Эти проекты остаются хотя бы несколько активными. В отличие от phc и rphp, они компилируют исходный код в байт-код, который требует выполнения библиотеки времени выполнения, а не в собственный код, который процессор может выполнять напрямую.

Повышение производительности PHP

В начале 2008 года оригинальные черты RFC проложили путь к стандарту и процессу RFC, которые впоследствии будут приняты командой внутреннего персонала PHP. Два года спустя, Дмитрий Стогов и Станислав «Стас» Малышев, два члена команды внутренних специалистов по PHP, подали предложение с описанием потенциальных улучшений производительности до 20% в Zend Engine, которое позже было реализовано. В том же году был выпущен PHP 5.3, включающий переход с гибкого лексера на re2c, что также привело к небольшому улучшению производительности. Было ясно, что производительность PHP стала не просто академической проблемой.

Введите хип-хоп

Facebook объявил о своей инициативе в середине февраля 2010 года, чтобы улучшить их общую отзывчивость в два раза. Примерно в то же время они объявили о выпуске HipHop для PHP, проекта, цель которого похожа на phc и rphp. HipHop преобразует код PHP в код C ++, который затем компилируется компилятором g ++. Это последовало за многочисленными усиливающими вклад в расширение APC и Zend Engine, и HipHop казался логичным следующим шагом для Facebook, чтобы продолжать использовать PHP и поддерживать существующую базу кода PHP.

Для реализации HipHop потребовалось пожертвовать некоторыми более динамичными функциями PHP, такими как поддержка eval() Однако это избавило разработчиков от необходимости использовать C или C ++ и заниматься скукой, которая поставляется с такими языками для написания скомпилированного кода. Действительно, Facebook утверждает, что загрузка ЦП снизилась на 50% после развертывания HipHop на их серверах.

Проект вызвал ряд мнений у членов сообщества PHP после его первоначального выпуска, включая Себастьяна Бергманна , ведущего разработчика PHPUnit; Дэвид Колалье , президент PEAR и технический директор echolibre; и Брэндон Сэвидж , разработчик в Mozilla. В целом его прием был положительным, и развитие проекта продолжалось. Facebook работал с несколькими популярными проектами в сообществе PHP, включая Drupal и WordPress, чтобы помочь им удалить код с помощью динамических функций, не поддерживаемых HipHop, и исправить ошибки, обнаруженные при попытке развернуть эти проекты в HipHop. Они также продолжили улучшать производительность , даже до степени реализации более эффективного распределения памяти .

Новая виртуальная машина

Недавно Facebook выпустила виртуальную машину HipHop , или hhvm, которая получила освещение в нескольких источниках, таких как Ars Technica и ReadWriteWeb . hhvm стирает грань между компилятором и виртуальной машиной, как Zend Engine.

hhvm — это то, что называется компилятором Just-In-Time (или JIT). Вместо того чтобы проходить через фазу компиляции C ++ для перевода PHP в нативный код, hhvm переводит PHP в промежуточный язык байт-кода, называемый HipHop Byte Code (HHBC), который может быть преобразован в нативный код в режиме реального времени, когда это необходимо.

hhvm предназначен для замены статически скомпилированных двоичных файлов на основе HipHop в производство. После первого выпуска hhvm обеспечивает общее относительное увеличение производительности на 60%.

эпилог

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

Действительно, PHP прошел долгий путь от своего скромного начала в 1995 году. Хотя HipHop может не подходить для всех проектов или всех серверов, он может обеспечить повышение производительности крупномасштабных проектов и помочь им существенно снизить требования к операционному оборудованию. Это, безусловно, проект, направленный на то, чтобы ваш радар продвигался вперед, и является свидетельством динамичности экосистемы PHP.

Изображение через Iscatel / Shutterstock