- Создание EXE приложений на PHP
- INTRO
- Чёрный квадрат
- Окошки
- Волшебный ларец
- OUTRO
- PHP: Hypertext Preprocessor
- PHP For Windows
- PECL For Windows
- Which version do I choose?
- Apache
- VC15 & VS16
- TS and NTS
- What is PGO?
- amd64 (x86_64) Builds
- Long and multibyte path
- Archives
- Компилировать PHP на Windows
- Настройка среды сборки
Создание EXE приложений на PHP
INTRO
Все мы знаем что PHP предназначен для быстрого создания динамических Web страниц. Во всяком случае именно это написано на официальном сайте разработчиков PHP. Однако почему бы не попробовать найти PHP «немного» иное применение, например, попробовать создать полноценное приложение для Windows? Заинтересовал? Тогда понеслась!
Чёрный квадрат
Приложения делятся на консольные и оконные. Начнём с создания первых, так как это проще. Итак, для начала нужно определиться с тем, что мы будем писать. я предлагаю написать простой MD5 & Base64 Encoder — вещь в хозяйстве нужная и полезная, тем более здесь всё достаточно просто. Для запуска PHP скрипта из командной строки и передачи ему нужных параметров используется следующая конструкция:
Что касается содержания самого скрипта, то количество переданных параметров хранится в переменной $argc, а сами параметры хранятся в массиве $argv. На этом краткий инструктаж по консольным приложениям закончен и пришла пора приступить к активным действиям.
Чтобы не утруждать Вас написанием скрипта, я решил написать его за Вас. Вот что у меня получилось:
Скрипт написан и теперь самое интересное — компиляция в EXE приложение. Для компиляции консольных приложений я использую Roadsend Compiler Studio. Его можно скачать на сайте www.roadsend.com после бесплатной регистрации. Скачали? Теперь открываем Roadsend IDE, создаём новый проект (Project -> New), прописываем необходимые параметры (наш скрипт рекомендую кинуть именно в директорию проекта), жмём «OK» и наконец даём заветное Project -> Build. Теперь направляемся в папку с проектом и если Вы всё правильно сделали — в ней Вы найдёте готовый EXE. Это всё? Да. Всё просто, если знать некоторые нюансы. Единственное что я рекомендовал бы — иногда полезно пошаманить с подключаемыми библиотеками, а так же можно упаковать наш EXE UPX`м, хотя эту тему я затрону чуть ниже. Теперь перейдём к оконным приложениям.
Окошки
Как Вы наверное уже догадались — при создании оконных приложений штатными средствами PHP уже не обойтись, поэтому для начала нужно выбрать инструмент для разработки нашего окошка. Среди всех инструментов больше всего выделяются два — это достаточно раскрученый PHP-GTK (www.gtk.php.net) и менее раскрученный, но не менее функциональный WinBlider (www.winbinder.org). Здесь как раз тот случай, когда более раскрученный и известный оказывается не так уж и хорош (это моё имхо), поэтому для разработки нашей первой форточки на PHP мы будем использовать WinBlinder. Для начала его нужно скачать. Готово? Окей, двигаемся дальше.
Винблиндер имеет свой собственный формат данных — phpw, который Вы можете сразу смело привязывать к вашему любимому редактору кода. По умолчанию при запуске phpw файла открывается содержащийся в нём PHP скрипт и прогоняется через интерпретатор с уже подключеными библиотеками блиндера. Как Вы наверное поняли — учится программировать на этой балалайке Вам придётся самим, однако в это нет ничего сложного, особенно человеку хоть немного знакомому с ООП в PHP. Однако даже незнакомый тоже сможет на нём кодить, так как по сути блиндер (в отличии от PHP-GTK) поддерживает и процедурное программирование. Кроме того WinBlinder весьма неплохо документирован, а инсталл архив уже содержит в себе несколько весьма любопытных примеров (особое внимание прошу обратить на редактор форм). У блиндера есть ещё куча фишек, функций и интересностей, но рамки данной статьи не позволяют мне на них останавливаться. Теперь пожалуй самое подходящее время вспомнить о нашем кодере. Чтобы не перегружать всё кодом я решил написать лишь MD5 Encoder:
Код достаточно прост и думаю посидев с документацией 1-2 часа Вы начнёте разбираться в нём так же, как и я. Ну а теперь кульминация — собираем форточку. Для этого предлагаю создать отдельную директорию и перенести наш скрипт туда. Так же нужно перенести туда папку include из phpcode директории винблиндера. Готово? Теперь компилируем! Эээ. стоп не нужно хвататься за Roadsend IDE. Как? А вот так! Он не поддерживает блиндер, а поддерживает только GTK, причём судя по туманным ответам разработчиков Roadsend на их форуме — поддержку блиндера можно ещё долго ждать. Однако вытрем сопли, и будем искать другие пути, и имя этим путям Bamcompile (www.bambalam.se/bamcompile/). Однако по каким-то причинам версия 1.21 не всегда верно работает и иногда компилирует всё в неработающее приложение, однако версия 1.1 такими глюками не страдает, поэтому рекомендую использовать её. Теперь щедро выделяем для нашего компилятора отдельную папку, заходим в командную строку и гордо командуем:
Если всё сделано правильно, то в директории с компилятором будет лежать свежесколоченое оконное приложение. Всё. Добавлю лишь, что все приложения я ещё рекомендовал бы упаковывать UPX`ом (который идёт сразу с Bamcompile).
Волшебный ларец
Все вышесказанное конечно весьма интересне и познавательно, однако бывают моменты когда нужных инструментов под рукой нет. Что делать тогда? Специально для такого случая есть один весьма любопытный приём получения EXE через шаманство в опциях SFX архива WinRAR. В качестве примера я буду использовать наш первый скрипт для консоли. Для начала помещаем наш скрипт в отдельную папку, туда же копируем php.exe и php*ts.dll. Далее создаём в этой же папке run.bat следующего содержания:
Теперь нам необходимо это добро упаковать, для этого выделяем все файлы, жмём правой кнопкой и выбираем «Add to archive. «.
В появившемся окне выбираем формат архива RAR, выставляем максимальное сжатие и ставим галочку «Create SFX archive».
После этого переходим во складку «Advanced -> SFX Options», там выставляем переключатель на «Create in curent folder» и в «Run after extraction» прописываем «run.bat», а так же во вкладке «Modes» выставляем галочку «Unpack to temporary folder», а так же выставляем переключатели «Hide all» и «Overwrite all files».
По вкусу можете прилипить свою иконку в соответвующей вкладке. Теперь подтверждаем создание архива и на выходе получаем EXE без всяких компиляторов.
OUTRO
Итак, сегодня я показал Вам, как легко и просто можно раздвинуть границы использования PHP. Конечно кто-то всё это назовёт бредом, скажет мол размер у приложений большой, и память у них течет, и муторно всё это. Пусть говорят, однако никто не призывает Вас писать все оконные приложения на PHP, а данная статья лишь неплохое подспорье для пхп кодеров и всех интересующихся. На сим я закончу. Удачи.
PHP: Hypertext Preprocessor
Are you seeing a warning from Windows Defender? Check out this info.
PHP For Windows
This site is dedicated to supporting PHP on Microsoft Windows. It also supports ports of PHP extensions or features as well as providing special builds for the various Windows architectures.
If you like to build your own PHP binaries, instructions can be found on the Wiki.
PECL For Windows
PECL extensions for Windows is being worked on. Windows DLL can be downloaded right from the PECL website.
The PECL extension release and snapshot build directories are browsable directly.
Which version do I choose?
If you are using PHP as FastCGI with IIS you should use the Non-Thread Safe (NTS) versions of PHP.
Apache
Please use the Apache builds provided by Apache Lounge. They provide VC15 and VS16 builds of Apache for x86 and x64. We use their binaries to build the Apache SAPIs.
With Apache, using the apache2handler SAPI, you have to use the Thread Safe (TS) versions of PHP.
VC15 & VS16
More recent versions of PHP are built with VC15 or VS16 (Visual Studio 2017 or 2019 compiler respectively) and include improvements in performance and stability.
— The VC15 and VS16 builds require to have the Visual C++ Redistributable for Visual Studio 2015-2019 x64 or x86 installed
TS and NTS
TS refers to multithread capable builds. NTS refers to single thread only builds. Use case for TS binaries involves interaction with a multithreaded SAPI and PHP loaded as a module into a web server. For NTS binaries the widespread use case is interaction with a web server through the FastCGI protocol, utilizing no multithreading (but also for example CLI).
What is PGO?
Profile Guided Optimization is an optimization feature available in Microsoft’s Visual C++ compiler that allows you to optimize an output file based on profiling data collected during test runs of the application or module.
Links:
amd64 (x86_64) Builds
PHP 7 provides full 64-bit support. The x64 builds of PHP 7 support native 64-bit integers, LFS, 64-bit memory_limit and much more.
x64 builds are recommended (almost all Windows installations support x64).
Long and multibyte path
PHP 7.1+ supports long and UTF-8 paths. See the manual for details.
Archives
Past releases are available from our archives, older versions not found there can be found at the Museum.
Компилировать PHP на Windows
Компиляция PHP из исходного кода чаще выполняется в системах типа Unix. Те, кто работает в среде Windows, чаще загружают и устанавливают PHP из предварительно скомпилированных пакетов. И хотя я не согласен, проще использовать предварительно скомпилированное решение, даже в системах Unix, но есть некоторые преимущества, которые могут возникнуть при компиляции двоичного файла из исходного кода. В общем:
- У вас есть возможность точно настроить конечный продукт при компиляции. Возможно, вы хотите, чтобы конкретное расширение было скомпилировано непосредственно в двоичный файл, а не загружалось как внешняя библиотека. Или, возможно, вы хотите отключить определенную функцию, которая обычно будет доступна по умолчанию.
- Вы можете внести изменения в процесс компиляции, если вы так склонны, что может повысить производительность для вашей конкретной среды (конечно, это предполагает, что вы уже знаете, что делаете, и в этом случае вы не будете читать эту статью).
- Компиляция может быть единственным способом заставить все работать, если предварительно скомпилированные двоичные файлы были созданы на основе более старых версий поддерживающего программного обеспечения и библиотек, чем вы используете в своей системе.
Но будьте осторожны: компиляция может быть неприятной задачей, особенно в Windows! Вы должны убедиться, что ваша среда сборки настроена правильно, узнать, как правильно использовать компилятор и другие инструменты сборки, и удовлетворить любые зависимости библиотеки. Надеюсь, эта статья станет вашим первым шагом в преодолении многих из этих препятствий.
Настройка среды сборки
PHP написан на C, поэтому компилятор C необходим, если вы собираетесь создавать PHP из исходного кода. C ++ — это супер-набор C, поэтому хороший компилятор C ++ также должен уметь компилировать код на C, хотя иногда это не всегда так. Для Windows должно быть достаточно Microsoft Visual C ++ Express (далее я буду называть его VC ++), который можно бесплатно загрузить с веб-сайта Microsoft . Я использую издание 2010 года для этой записи.
При выборе версии компилятора, вы должны иметь в виду, как вы будете использовать PHP. Если вы будете запускать mod_php с официально предварительно скомпилированным двоичным файлом Apache, вам нужно будет скомпилировать PHP с использованием Visual Studio 6, так как это версия, используемая для компиляции Apache. Модуль должен предназначаться для той же самой библиотеки времени выполнения как Apache, в этом случае msvcrt.dll . Если вы собираете Apache из исходного кода или если вы собираетесь запускать PHP как CLI или FastCGI, то это не проблема, и 2010 год будет работать просто отлично.
Вам также нужно будет установить пакет средств разработки программного обеспечения Windows (здесь после SDK). SDK предоставляет нам важные заголовочные файлы для платформы Windows, которые нам понадобятся для успешной компиляции. Это также доступно бесплатно ; Я использую версию 7.1.
Сначала установите компилятор, а затем SDK. Я не буду обсуждать установку, так как у обоих есть графический мастер установки, который проведет вас через процесс.
После того, как вы настроили работающий компилятор, загрузите бинарные инструменты и пакеты deps с windows.php.net/downloads/php-sdk . Пакет бинарных инструментов (я использую архив 20110915) содержит инструменты разработки, такие как re2c, bison и некоторые дополнительные команды, которые понадобятся вам для сборки PHP. Пакет deps (я использую архив 5.4, поскольку он совпадает с версией PHP, которую я буду компилировать) содержит минимальные необходимые заголовочные и библиотечные зависимости, такие как zlib.h
Вероятно, само собой разумеется, что вы также захотите скачать исходный код PHP с windows.php.net/download . На момент написания этой статьи текущая версия PHP была 5.4.6, поэтому номер версии вы увидите в моих примерах.
Хорошая идея — создать рабочую область, в которую вы можете распаковать исходный код и скомпилировать его, не испортив остальную часть вашей системы. Создайте папку C:PHP-Dev которая будет служить рабочим каталогом, а затем распакуйте в нее архив бинарных инструментов.
Затем извлеките содержимое исходного архива PHP в C:PHP-Dev чтобы у вас там php5.4 исходная папка php5.4 , а затем извлеките архив deps в deps папку deps . Ваша структура каталогов должна выглядеть примерно так:
Откройте командную строку Windows SDK, которая была установлена вместе с SDK (Пуск> Microsoft Windows SDK> Командная строка Windows SDK), и выполните следующие команды:
Использование консоли командной строки SDK желательно по сравнению с обычной консолью cmd.exe как она устанавливает множество переменных среды, специфичных для компиляции исходного кода. Команды компиляции позже также должны быть выполнены в этой консоли.
Флаги для setenv устанавливают некоторые свойства сборки для среды; В этом случае я настроил среду для сборки 32-разрядной версии Windows XP. Вы можете попробовать и собрать с /x64 если вы чувствуете себя предприимчивым, но с этим все еще есть некоторые проблемы. Указание разных версий Windows, таких как /vista , скорее всего, приведет к проблемам из-за некоторых странных определений в скриптах сборки (PHP по-прежнему стремится быть XP-совместимым). Если вы действительно не знаете, что делаете, возможно, безопаснее всего придерживаться рекомендованных значений, которые я использовал выше.