HHVM (HipHop Virtual Machine) — это виртуальная машина с открытым исходным кодом предназначенная для выполнения скриптов, написанных на Hack и PHP. HHVM использует JIT-компиляцию для достижения высокой производительности при сохранении гибкости разработки, которая обеспечивает PHP. Как-то так звучит перевод с официального сайта.
Ну вот настал тот момент, когда и я заинтересовался сием чудом от Facebook и попробую записать все манипуляции по установке к себе на сервер. Скажу честно, что колесо я тут переоткрывать не собираюсь, на гитхабе проекта есть готовые мануалы и прочие доки. С чем столкнулся, так это с проблемой в шелле установки HHVM, он заточен под старый nginx, поэтому я хост настрою сам. Еще один важный момент, что нужна платформа amd64, ибо i386 не поддерживается.
Поехали…
Первым делом поставим Nginx. Как это сделать написано в заметке Установка Nginx на Debian 6.
Подключим репозитарий HHVM:
# nano /etc/apt/sources.list
Дописываем репозитарий:
# HHVM deb http://dl.hhvm.com/debian wheezy main
Добавляем ключ:
# wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | apt-key add -
Обновляемся:
# apt-get update && apt-get upgrade
Проверяем:
# apt-cache search hhvm hhvm - HHVM virtual machine, runtime, and JIT for the PHP language hhvm-dbg - HHVM virtual machine, runtime, and JIT for the PHP language hhvm-fastcgi - The package provides FastCGI support for HHVM. HHVM is a high-performance just-in-time compiled PHP runtime. FastCGI is a protocol that allows language interpreters to run behind web servers. hhvm-nightly - HHVM virtual machine, runtime, and JIT for the PHP language hhvm-nightly-dbg - HHVM virtual machine, runtime, and JIT for the PHP language
Отлично, всё на месте! Приступим к установке:
# apt-get install hhvm
В конце мы получим такую вот инфу:
******************************************************************** * HHVM is installed. Here are some more things you might want to do: * * Configure your webserver to use HHVM: * $ sudo /usr/share/hhvm/install_fastcgi.sh * $ sudo /etc/init.d/nginx restart * $ sudo /etc/init.d/apache restart * $ sudo /etc/init.d/hhvm restart * * Run command line scripts with HHVM: * $ hhvm whatever.php * * Use HHVM for /usr/bin/php even if you have php-cli installed: * $ sudo /usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60 ********************************************************************
В процессе первой установки я слепо поверил ману и запустил /usr/share/hhvm/install_fastcgi.sh, но он написан под старый nginx, точнее старую иерархию папок и конфигов. Теперь я его запускать не буду, нет смысла, можно вручную правки внести.
Сам файл есть на гитхабе: https://github.com/hhvm/packaging/blob/master/hhvm/deb/skeleton/usr/share/hhvm/install_fastcgi.sh
Настроим дефолтный хост Nginx-а:
# nano /etc/nginx/conf.d/default.conf
В следствии правок получится такой файлик:
server { listen 80; server_name localhost; root /usr/share/nginx/html; include hhvm.conf; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Если грубо, то всё сводится к подключению файла hhvm.conf.
Теперь посмотрим что же внутри hhvm.conf:
location ~ \.(hh|php)$ { fastcgi_keep_conn on; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
И проверим конфиг HHVM:
; php options pid = /var/run/hhvm/pid ; hhvm specific hhvm.server.port = 9000 hhvm.server.type = fastcgi hhvm.server.default_document = index.php hhvm.log.level = Warning hhvm.log.always_log_unhandled_exceptions = true hhvm.log.runtime_error_reporting_level = 8191 hhvm.log.use_log_file = true hhvm.log.file = /var/log/hhvm/error.log hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc hhvm.mysql.typed_results = false
Теперь рестартанем Nginx и HHVM:
# service nginx restart && service hhvm restart
Теперь всё в порядке, можно тестить. Создадим тестовый файл:
# echo "<!--?php phpinfo(); ?-->" > /usr/share/nginx/html/index.php
Если открыть его, то увидим надпись «HipHop». Вот, как это выглядит в консоли:
# php /usr/share/nginx/html/index.php HipHop
Если у вас так же, значит всё замечательно работает! 🙂
Но мне хочется это дело кинуть на сокет, поэтому нужно внести небольшие изменения:
# nano /etc/nginx/conf.d/default.conf
location ~ \.(hh|php)$ { fastcgi_keep_conn on; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/hhvm/hhvm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
… и поправим еще конфиг /etc/hhvm/server.ini:
# nano /etc/hhvm/server.ini
; php options pid = /var/run/hhvm/pid ; hhvm specific ;hhvm.server.port = 9000 hhvm.server.file_socket=/var/run/hhvm/hhvm.sock hhvm.server.type = fastcgi hhvm.server.default_document = index.php hhvm.log.level = Warning hhvm.log.always_log_unhandled_exceptions = true hhvm.log.runtime_error_reporting_level = 8191 hhvm.log.use_log_file = true hhvm.log.file = /var/log/hhvm/error.log hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc hhvm.mysql.typed_results = false
Снова рестартанем Nginx и HHVM:
# service nginx restart && service hhvm restart
Проверяем:
# php /usr/share/nginx/html/index.php HipHop
Помните, после уставноки HHVM нам выдало небольшую инструкцию? Так вот, в её конце был такой текст:
* Use HHVM for /usr/bin/php even if you have php-cli installed: * $ sudo /usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60
Если хотите, чтобы обращения к php перенаправлялись на hhvm, то выполните команду. Для лучшего понимания, пример:
# php -v HipHop VM 3.0.1 (rel) Compiler: tags/HHVM-3.0.1-0-g97c0ac06000e060376fdac4a7970e954e77900d6 Repo schema: a1146d49c5ba0d6db903beb3a4ed8a3766fef182
Теперь пора сделать автозапуск сервиса:
# update-rc.d hhvm defaults update-rc.d: using dependency based boot sequencing
Теперь можно смело использовать сие благо. Успехов, господа! 🙂
Немного ссылок которыми воспользовался:
http://hhvm.com/
https://github.com/facebook/hhvm
https://github.com/facebook/hhvm/wiki/FastCGI#making-it-work-with-nginx
http://habrahabr.ru/post/208778/