Настройка оборудования и программного обеспечения

Бесплатные PHP компиляторы. Одна из дополнительных возможностей

PHP - интерпретируемый язык программирования, при каждом запросе происходит анализ и "выполнение" исходного кода. Такой подход, конечно, очень удобен на стадии разработки проекта, но вносит лишний шаг в процесс выполнения продакшен кода. Таким образом интерпретация, на первый взгляд сильная сторона PHP, стоит лишнего процесорного времени и ресурсов.

Ниже речь пойдет о компиляторах, позволяющих компилировать php код в C++, а его в исполняемый. Таким образом PHP приложения выполняются непосредсвенно процессором, минуя интерпретатор.

Проверим все ли так хорошо на практике.

Как работает интерпретатор

Интерпретация PHP кода проходит в два этапа:

  1. Парсинг кода и генерация опкодов (Zend opcodes) - инструкций, понятных интерпретатору.
  2. Выполнение опкодов.

Тогда как первая фаза хорошо поддается оптимизации (использование кеша опкодов), вторая довольно закрытая - интерпретатор всегда является посредником между набором команд и процессором, выполняющим их. Без интерпретатора, процессору не понять, чего делать с опкодами.

Чтобы избавиться от звена-интерпретатора придумали компиляторы, наиболее популярный и свежий из них HipHop от Facebook. Пощупаем его поближе.

HipHop PHP

HipHop написан разработчиками Facebook и представляет собой приложение, которое:
  1. оптимизирует PHP код
  2. конвертирует в С++
  3. генерирует из вашего приложения многопоточный веб-сервер исполняющий его
  4. компилирует в исполняемый код при помощи g++

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

Проверим, как справится HipHop с компилированием приложения написаного с использованием фреймворка, например Wordpress.

Компилируем Wordpress

После установки HipHop в папке src/hphp/ получим файл hphp, который и является компилятором. Перед началом компиляции, устанавливаем переменные среды:

Cd .. # переходим в папку с hiphop export HPHP_HOME=`pwd` export HPHP_LIB=`pwd`/bin export CMAKE_PREFIX_PATH=`/bin/pwd`/../

и вперед!

Скачиваем Wordpress и разархивируем архив:

Wget http://wordpress.org/latest.tar.gz tar zxvf latest.tar.gz

Копируем wp-config-sample.php в wp-config.php и указываем настройки соединения с базой (в настройках хоста указываем 127.0.0.1, а не localhost).

Для удачной компиляции нужно немного пропатчить Wordpress:

  1. Открываем wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php и заменяем: function &loopback(/* args.. */) { return func_get_args(); } на function &loopback(/* args.. */) { $ret = func_get_args(); return $ret; }
  2. В wp-includes/query.php, вместо if (!isset($q["suppress_filters"])) $q["suppress_filters"] = false; вставляем $q["suppress_filters"] = true;

Wordpress готов.

Hiphop"у нужно указать список файлов, которые будем компилировать - получим его и сохраним в files.list:

Find . -name "*.php" > files.list

Все готово к компиляции, приступим:

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

После завершения выполнения команды, во временной папке (в начале компиляции hphp покажет ее путь, что то типа "/tmp/hphp_ptRgV1") получим скомпилированный веб-сервер. Запустим его (если на 80 порту, что-то висит, например apache или nginx - нужно сначала остановить, чтобы освободить порт):

Sudo /tmp/hphp_6s0pzd/program -m server -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf

Вуаля! Перейдя на http://localost увидим рабочий Wordpress блог.

Производительность

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

Как видите результаты получились шокирующие: скомпилированый блог работает в среднем в 6 раз быстрее! Среднее количество обработанных запросов за секунду в нескомпилированом 9, а в скомпилированом 50! Не знаю как вас, а меня эти результаты поразили, такого сильного прироста производительности не ожидал.

Подведем итог

После таких ошеломляющих результатов можно сказать только одно - ребята из Facebook поработали на славу. Компилятор действительно делает из приложения ракету и хотя перед компилированием приложение нужно подготавливать - результат того стоит.

В тему:

Если пост понравился - нажмите на гугловский +1 - мне будет больше мотивации писать ещё и просто приятно.

Все бесплатные компиляторы PHP, которые представлены здесь, могут пересобирать PHP скрипты в машинный код, способный работать на компьютере без загрузки специального PHP интерпретатора, или компилировать их в интерфейс командной строки байт-кода (для установки необходим NET или Mono framework или Java байт-кода (где требуется виртуальная машина Java для установки)).

Такие компиляторы могут быть полезны для различных целей: они могут ускорять выполнение вашего скрипта, поскольку больше не интерпретируются во времени выполнения; или благодаря им, вы можете распространять свои приложения, не выявляя исходного кода (что требуют другие коммерческие скрипты). Я предполагаю, что они также подходят в случае, когда кто-то хочет написать интернет-зависимые программы PHP и распространять их с функцией запуска на рабочем столе (в отличие от обычных веб-приложений, которые выполняются на сервере), это всё возможно потому, что PHP является лёгким в обучении языком программирования и базово содержит в себе множество встроенных функций с доступом к интернету. (В этом случае, вам либо придется распространять приложения с встроенным веб-сервером или используйте компилятор, который компилирует сервер в ваше приложение.)

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

Полезная информация для тех, кто ещё не знает, что официальную версию PHP-переводчика можно скачать на сайте PHP: Hypertext Processor.

Бесплатные компиляторы PHP для составления скриптов native code, .NET или Java байт-кода.

Bambalam (новинка)

Эта программа производит самостоятельные Windows приложения EXE для вашего PHP исходного кода. Это не совсем компилятор для native code, поскольку он просто кодирует исходный код и встраивает интерпретатор PHP, но эта программа, безусловно, подходит людям, которые ищут компиляторы для native и byte-code. К тому времени, как вся программа была написана, средой её выполнения была встроенная версия PHP 4.4.4 (программа не обновлялась с 2006 года). Исходный код для Bambalam находится в открытом доступе.

Phalanger (для.NET)

Phalanger компилирует ваш PHP код в байт-код CLI (.exe или.dll). Эту программу можно запустить через.NET 4.0 или Mono frameworks. Ваш PHP код может использовать любые объекты.NET и дополнительные библиотеки стандартного расширения PHP. Получившаяся NET-сборка может быть как подписанной, так и скрытой. Данная программа также выпускает шаблоны, позволяющие вам создавать приложения PHP с помощью Visual Studio. Программа выпущена под лицензией Apache.

HipHop for PHP (для native code)

HipHop переводит ваш PHP код на код С++, который позже компилируется, используя компилятор GNU C++, в исполняемый двоичный код. Компилятор поддерживает все функции версии PHP 5.3 (конечно, за исключением такой вещи, как eval() ). Он работает и компилирует код для 64 битной версии Linux и FreeBSD. Так как программа распространяется в форме исходного кода, вам придётся компилировать вручную (самостоятельно). Она выпускается под лицензией PHP Licence.

Roadsend PHP (для native code).

Компилятор Roadsend PHP производит машинные двоичные (исполняемые) файлы для Windows и Linux. Ваши скрипты не ограничиваются программами консоли (командными строками): они могут быть построены с помощью встроенных веб-серверов, позволяющих им работать тем способом, которым они работают на веб-сайте, пусть и на вашей конечно пользовательской системе. Компилятор выпущен под лицензией GNU GPL и выполняется под GNU LGPL. К несчастью, программа остановила своё активное развитие.

Project Zero (для Java)

(Замечание: похоже, это программное обеспечение является ныне несуществующим. Сайт вот уже как пол года является недосягаемым.) Project Zero включает в себя компилятор и среду CLR, которые могут прокомпилировать ваш PHP код в Java bytecode и исполнять его. Заметьте, что Project Zero является чем-то большим, чем просто PHP компилятором/средой выполнения; он представляет собой развитую среду, которая позволяет вам совершенствовать веб-приложения, используя PHP или Groovy (другой скрипт-язык). Этот компилятор доступен для Windows, Mac OS X и Linux. Для того, чтобы работать с этим компилятором, вам понадобиться скачать Java Development Kit.

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

Теги: PHP компиляторы, перевод скриптов

Компиляция PHP из исходных кодов чаще делается на Unix-подобных систем. Те, кто работает в среде ОС Windows, скорее всего, загрузит и установит PHP из бинарных пакетов. И хотя я не согласен, что это проще в использовании, предварительно скомпилированных решение, даже на системах Unix есть некоторые преимущества, которые могут прийти с составлением двоичной от источника. В общем:

  • У вас есть возможность тонкой настройки конечного продукта при компиляции. Может быть, вы хотите определенное расширение которое компилируется непосредственно в двоичном, а не загружать его в качестве внешней библиотеки. Или, возможно, вы хотите, выключить то что особенностью которого, как правило, доступно по умолчанию.
  • Вы можете сделать хитрость, в процессе компиляции, если нужно, которые могут повысить производительность для конкретной среды (конечно, это предполагает, что вы уже знаете, что вы делаете в этом случае вы бы не читали эту статью !).
  • Компиляция может быть единственным способом заставить вещи работать, если скомпилированные двоичные файлы были построены на более старых версиях с поддержкой программного обеспечения и библиотек, а сейчас Вы работаете на новой системе.

Предупреждение: компиляция может разочаровать, особенно на Windows! Вы должны убедиться, сборка среды настроена правильно, узнаете, как использовать компилятор и другие инструменты для сборки должным образом, и удовлетворить любые библиотеки зависимостей. Надеемся, эта статья ваш первый шаг в преодолении многих из этих препятствий.

Настройка среды сборки

PHP написан на C и поэтому компилятор C необходим, если вы собираетесь построить PHP из исходных кодов. C + + это супер набор C, так что хороший C + + компилятор должен иметь возможность компилировать код C, и хотя это не всегда так. Для Windows, Visual Microsoft, C + + Express (который после будет называться VC + +) в свободном доступе на веб-сайте компании Microsoft . Использовалось издание 2010 года.

При выборе версии компилятора, вы должны иметь в виду, как вы будете работать под управлением PHP. Если вам придется работать с mod_php официально скомпилированных двоичных Apache, и вы хотите, скомпилировать PHP с помощью Visual Studio 6, так как это версия для компиляции Apache. Модуль должен нацелиться на ту же библиотеку времени выполнения, как Apache, в этом случае msvcrt.dll . Если вы строите Apache из исходных кодов, а также, или если вы собираетесь запускать PHP как FastCGI или CLI, то это не проблема, и 2010 год будет работать нормально.

Вы также должны установить программное обеспечение Windows Development Kit (SDK после). SDK дает нам важные файлы заголовков для платформы Windows, которая нам понадобится для успешной компиляции. Это тоже , использовалась версия 7.1.

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

Если у вас есть работающий компилятор создать, загрузить двоичный инструменты и Известные пакеты из windows.php.net . Бинарный пакет инструментов (я использую 20110915 архив) содержит средства разработки, как re2c, зубры, и некоторые дополнительные команды, которые вы должны будете построить PHP. Известные пакет (я использую 5,4 архив, поскольку это совпадает с версией PHP я буду компиляции) содержит минимальные заголовки и библиотеки зависимостей необходимо, например, zlib.h .

Это, вероятно, само собой разумеется, что вы хотите скачать источник PHP, а также от windows.php.net . На момент написания этой статьи, текущая версия PHP 5.4.6, так что этот номер версии вы увидите в примерах.

Это хорошая идея, чтобы создать рабочее пространство, к которому можно распаковать исходный код и компилировать что бы они не влияли на остальную часть Вашей системы. Создайте папку C: \ PHP-Dev , которая будут служить в качестве рабочего каталога, а затем распаковать в ней бинарный архив и инструменты.

Далее, распакуйте содержимое архива, источник PHP в C: \ PHP-Dev теперь у вас есть php5.4 в исходной папке, а затем извлечь его архив deps в одноуровневую папку deps. Структура каталога должна выглядеть примерно так:

Откройте Windows SDK Command Prompt, которая была установлен ​​с SDK (Start => Microsoft Windows SDK => Windows SDK Command Prompt) и выполнить следующие команды:

Setenv /release /xp /x86 cd C:\PHP-Dev bin\phpsdk_setvars.bat

С помощью командной строки консоли SDK желательно перед обычным cmd.exe консоли, как она задает много переменных среды, специфичных для компиляции исходного кода. Компиляции команд позже также должны быть выполнены в этой консоли.

setenv установить некоторые свойства сборки для окружающей среды, в данном случае установлена среда целевой Windows XP 32-разрядной версии сборки. Вы можете попробовать и построить с / x64 , если вы ищете приключений. Определение различных версий Windows, таких как / Vista , скорее всего, проблемы выхода из-за какой-то странной определений в скриптах (PHP по-прежнему хочет быть XP-совместимым). Если вы действительно не знаете, что вы делаете, это, наверное, безопаснее всего придерживаться рекомендуемых значений, которые я использовал выше.

phpsdk_setvars.bat сценарий выходит на некоторые дополнительные переменные окружения, процесс сборки смог найти бинарные инструменты.

Имейте в виду, что все эти переменные настройки только временные сессии в консоли. Если вы всё быстро закроете что бы вернуться к компиляции позже, вам необходимо будет выполнить команду еще раз, а если вы этого не сделаете, вы будете получать ошибки вроде следующего, когда вы позже запустите настроить, вы не сможет продолжить:

Checking for bison.exe ... ERROR: bison is required

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

Компиляция PHP

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

После buildconf завершает (это займет всего секунду), выполните настройку configure --help - и изучить помощь, какие функции вы хотите включить / выключить, а затем снова запустите configure (настройки) с любой желаемой опцией. Это хорошая идея, чтобы проверить выходные перед переходом, поскольку он предупредит вас, если любой из необходимых зависимостей не доступны. Если это произойдет, вы можете либо установить зависимости и повторно запустить настройку еще раз или отрегулируйте вызова для отключения расширений, которые в них нуждаются.

Наконец, запустите NMAKE , чтобы начать компиляции.

Cd C:\PHP-Dev\php5.4 buildconf configure nmake nmake test

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

Когда первый NMAKE процесса компиляции завершен вы найдете свой ​​новенькие PHP файлы в папке Release_TS. NMAKE тест запускает новые двойные через ёмкость ошибка тестов, чтобы убедиться, что все работает как и должно быть. Результаты тестов NMAKE направляются в QA команда, которая зависит от них, чтобы улучшить PHP, так что это может занять несколько минут, для работы, это ответственное дело.

На этом этапе вы также можете воспользоваться дополнительным шагом ведения NMAKE оснастки, которая создаст ZIP архивы и двоичные файлы, которые можно скопировать вокруг.

Компиляция extensions

Есть два пути для компиляции PHP extensions (расширений): статически и динамически. Статически скомпилированные расширение компилируется в бинарный PHP, в то время как динамически скомпилированных один отдельный DLL, которые могут быть загружены позже через php.ini файл. Расширения, как правило, составлен по состоянию DLL, хотя есть некоторые преимущества для статической компиляции, а также, в конечном итоге это зависит от ваших потребностей.

Для компиляции PHP extensions (расширений) на Windows, экстракт расширение исходного кода папку, в ext папку вашу директорию-источник PHP. Затем, заново настроить скрипт, запустив buildconf--force и перекомпиляции PHP, используя соответствующие пункты, чтобы включить расширение.

В качестве примера, давайте компиляции расширение AOP статически. Скачать исходный код из PECL , и распакуйте его в папку, в ext . Затем выполните следующие действия:

Cd C:\PHP-Dev\php5.4 buildconf --force configure --enable-aop nmake

Опцией --force, buildconf сила ей восстановить конфигурационный скрипт. Затем, запустите configure --help и вы должны увидеть вариант включить новое расширение на выходе. В этом случае, это --enable-AOP.

Когда nmake finishes заканчивается, вы должны будете недавно построенный PHP двоичный PHP с AOP.

Расширения будут доступны как DLL, а не испеченный в PHP, вы можете выполнить те же действия, что и выше, но определять "shared" (общие) в качестве значения для настройки, позволяет вариант.

Buildconf --force configure --enable-aop=shared

В результате DLL будет в папке Release_TS вместе с двоичным PHP компиляция закончится, в данном случае имя php_aop.dll .

P.S.

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

Статья подготовлена для вас, коллективом сайта
Оригинал статьи:
Перевел: Виктор Клим

Языки программирования бывают двух видов: интерпретируемые и компилируемые. А каким языком является PHP? Для того, чтобы ответить на этот вопрос, нам необходимо разобраться в терминологии.

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

Интерпретатор – это совершенно другая категория. Интерпретатор не переводит код, а исполняет его. Интерпретатор анализирует код программы и исполняет каждую его строку. Каждый раз при исполнении такого кода, необходимо пользоваться интерпретатором.

По производительности интерпретаторы значительно уступают компиляторам, поскольку двоичный код выполняется намного быстрее. Зато интерпретаторы позволяют полностью контролировать программу во время ее исполнения.

Что касается PHP, то он не является ни компилятором, ни интерпретатором. PHP представляет собой нечто среднее, между компилятором и интерпретатором. Попробуем в этом разобраться и рассмотрим, как PHP обрабатывает код.

Рассмотрим рисунок:

Мы видим, что PHP составлен из двух почти независимых блоков - транслятора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений быстродействия.

На вход PHP подается сценарий. Он переводит его (транслирует) , проверяя синтаксис, в специальный байт-код (внутреннее представление). Затем PHP выполняет байт-код (а не код самой программы), при этом он не создает исполняемый файл.

Байт-код значительно компактнее обыкновенного кода программы, поэтому его легче (и быстрее) интерпретировать (выполнять). Посудите сами: синтаксический разбор осуществляется всего один раз на этапе трансляции, а исполняется уже "полуфабрикат" - байт-код, который гораздо более удобен для этих целей. Поэтому, PHP больше является интерпретатором, нежели компилятором. Такая «двойная работа» была необходима для следующих целей.

Рассмотрим цикл:

For (i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Такой цикл будет «крутиться» 10 раз. За каждый из этих десять проходов интерпретатор должен и 100 строк кода. А в ему нужно проанализировать и выполнить 10*100 = 1000 строк кода! Если перевести один раз весь цикл в байт-код, то анализировать ему придется в 10 раз меньше! А это значит, что сценарии будут выполняться в 10 раз быстрее!

Получается, что PHP является.

Главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях. Однако, замедление не так уж и существенно.

Стоит вспомнить, что PHP версии 3 был «чистым» интерпретатором», а с PHP 4 сценарии стали выполняться значительно быстрее, поскольку 4-я версия PHP (и PHP5) является интерпретирующим транслятором.

Язык Perl, который практически всегда называют компилятором, работает точно по такой же схеме - он транслирует текст программы во внутреннее представление, а затем использует результирующий код при исполнении. Так что, можно сказать, PHP версии 4 представляет собой компилятор ровно настолько, насколько им является Perl.

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

Использование интерпретатора (а значит и PHP) имеет свои неоспоримые преимущества:

  • Нет необходимости заботится об освобождении выделенной памяти, не нужно закрывать файлы по окончании работы с ними – всю рутинную работу сделает интерпретатор, поскольку программа выполняется под его бдительным контролем;
  • Не нужно думать о типах переменных, а также не нужно объявлять переменную до его первого использования;
  • Отладка программ и обнаружение ошибок существенно упрощаются – интерпретатор полностью контролирует этот процесс;
  • В контексте web-приложений, интерпретатор также имеет еще очень важное преимущество – нет опасности «зависания» сервера при неправильной работе программы.

Есть и другие достоинства. Вообще, использование интерпретатора способно дать сценариям ту мощь, которую пользователи Web от них и ожидают.

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

<<< Назад
(Что нового в PHP5 ?)
Содержание Вперед >>>
(Переход на PHP 5.3)

Есть еще вопросы или что-то непонятно - добро пожаловать на наш
Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!