Заинтригованный заявлением команды HHVM о том, что набор тестов Laravel при запуске на HHVM дает 100% положительный результат, я решил сделать базовое Laravel-приложение, работающее на HHVM.
Что такое HHVM?
Для начала история из «Великой книги интернета»:
Сначала PHP был не языком программирования, а набором CGI Perl скриптов, используемых для поддержания личной странички Расмуса. Прошло время, и в конце концов ядро интерпретатора PHP было переписано и названо Zend Engine. Если вам, как и мне, всегда было интересно, что означает «Zend», теперь вы это знаете.
Сегодня на PHP написаны горы сайтов. Об одном вы наверняка слышали — Facebook. И у Facebook, одного из крупнейших сайтов в мире, есть проблема: как взять весь этот PHP-код и сделать его как можно более быстрым?
Программисты сейчас должны подпрыгнуть и закричать: «Я знаю! Я знаю! Скомпилировать его в C(++)!» Это именно то, что сделал Facebook в проекте, который они назвали HipHop for PHP, или короче — «HPHP». Используя компилятор HPHP Facebook может компилировать весь свой PHP-код в бинарный, загружать его на свои серверы, и значительно увеличивать свою производительность. На самом деле Facebook добился 6-кратного увеличения скорости относительно Zend PHP. Потрясающе!
К сожалению, шаг «загружать его на свои серверы» был не таким потрясающим. Скомпилированный бинарный код превысил 1 Гб. К тому же, поддержание компилятора HPHP, как и необходимой HPHPi (среды разработки) и HPHPd (среды отладки), было серьезной задачей. Возможно, самая большая проблема была в том, что HPHPc, будучи компилятором для интерпретируемого языка, не мог поддерживать некоторые возможности PHP, такие как PHPeval()
и PHPcreate_function()
.
Чтобы обойти это, Facebook отказался от HPHPc и создал виртуальную машину PHP под названием HHVM. HHVM преобразует PHP-код в машиночитаемый байт-код, как это делается в JVM. Этот байт-код затем транслируется в 64-битный машинный код во время выполнения, используя JIT-компилятор (Just-In-Time). Теперь у Facebook нет длительного этапа сборки, и он может загружать на серверы только измененные файлы вместо бинарника размером 1 Гб, сохраняя при этом преимущества производительности HPHPc.
Как же?
Отлично! Давайте запустим на ней Laravel.
Сначала я установил HHVM на свой Macbook Air с OS X 10.9, но она работала не совсем хорошо. Когда я попытался получить доступ к серверу через HTTP, он загрузил мой процессор и просто сидел там.
Затем я установил HHVM на свой сервер с Ubuntu 13.10 x64, используя инструкцию на вики HHVM, которая отлично сработала. После этого я закончил с бинарным кодом hhvm, расположенным здесь:
~/dev/hhvm/hphp/hhvm/hhvm
Довольно странная иерархия директорий, но какая разница. Для простого доступа вы легко можете сделать символьную ссылку в /usr/local/bin.
Теперь очередь особенностей Laravel. Тейлор Отвелл выложил в Twitter конфигурацию, которую он использовал, и я использовал её. К сожалению, во время написания статьи Laravel Pastebin был недоступен, поэтому я сделал её зеркало в gist:
Сделайте wget в свою домашнюю директорию:
Server { Port = 80 SourceRoot = /Users/dan/hhvm-test/public/ } VirtualHost { * { Pattern = .* RewriteRules { * { pattern = .? # app bootstrap to = index.php # append the original query string qsa = true } } } } StaticFile { Extensions { css = text/css gif = image/gif html = text/html jpe = image/jpeg jpeg = image/jpeg jpg = image/jpeg png = image/png tif = image/tiff tiff = image/tiff txt = text/plain } }
shell$ wget https://gist.github.com/jazzdan/8262454/raw/5d190c4de5252399cb421f344a789aeb56bb4ebd/config.hdf
Теперь давайте установим Laravel.
Установите composer, если вы еще этого не сделали:
shell$ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer $ sudo apt-get install php5-mcrypt
shell$ php -m | grep mcrypt
shell$ composer create-project laravel/laravel hhvm-test --prefer-dist $ cd hhvm-test $ composer install
Когда с этим покончено, вы сможете запустить Laravel на HHVM этой командой:
shell$ cd ~/dev/hhvm/hphp/hhvm $ sudo ./hhvm -m server -c ~/config.hdf mapping self... mapping self took 0'00" (214686 us) wall time loading static content... searching all files under source root.source.. analyzing 5 files under source root... ..loaded 25 bytes of txt firstles loaded 25 bytes of static content in total loading static content took 0'00" (15735 us) wall time page server started all servers started
Если вы увидите подобный результат, значит у вас все получилось!
Я прошел все шаги из Быстрого старта Laravel на HHVM, и похоже всё работает, включая доступ к базе данных MySQL. Позже я расскажу, как у меня получится разрабатывать Laravel-приложения на ней.
Чем больше глаз, тем меньше от них ускользнёт багов, так говорят. Пожалуйста, проверьте ваши более развитые Laravel-проекты на HHVM, и сообщите об ошибках командам Laravel и HHVM. Я представляю себе будущее, когда благодаря HHVM у всех будут более мощные, более простые в развертывании PHP-приложения.