Создание EXE приложений на PHP
Все мы знаем что 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:
// Подключаем основную библиотеку
include «include/winbinder.php»;
// Даём метки окнам редактирования
define(‘IDC_EDITBOX1002’, 1002);
define(‘IDC_EDITBOX1003’, 1003);
// Рисуем окошко
$winmain = wb_create_window(null,
AppWindow,
‘MD5 Hash Generator by S1B [SBT]’,
WBC_CENTER, WBC_CENTER, 315, 134,
0x00000000, 0);
# Рисуем рамочку
wb_create_control($winmain, Frame, », 10, 10, 290, 85, 0, 0x00000000, 0, 0);
# Рисуем надписи (лейблы)
wb_create_control($winmain, Label, ‘Текст:’, 23, 35, 45, 15, 0, 0x00000000, 0, 0);
wb_create_control($winmain, Label, ‘Hash:’, 23, 65, 45, 15, 0, 0x00000000, 0, 0);
# Рисуем окошки редактирования (нижнее будет неактивным), и загоняем их данные в переменные
$text=wb_create_control($winmain, EditBox, », 78, 30, 210, 20, IDC_EDITBOX1002, 0x00000000, 0, 0);
$hash=wb_create_control($winmain, EditBox, », 78, 60, 210, 20, IDC_EDITBOX1003, 0x00000040, 0, 0);
// Две необходимые надписи =)
wb_set_handler($winmain, «process_main»);
wb_main_loop();
function process_main($window,$id) # Объявляем данные окошек редактирования глобальными
global $text,$hash;
switch($id) case IDC_EDITBOX1002:
wb_set_text($hash,md5(wb_get_text($text)));
break;
case IDCLOSE:
wb_destroy_window($window);
break;
>
>
?>
Код достаточно прост и думаю посидев с документацией 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 без всяких компиляторов.
Итак, сегодня я показал Вам, как легко и просто можно раздвинуть границы использования PHP. Конечно кто-то всё это назовёт бредом, скажет мол размер у приложений большой, и память у них течет, и муторно всё это. Пусть говорят, однако никто не призывает Вас писать все оконные приложения на PHP, а данная статья лишь неплохое подспорье для пхп кодеров и всех интересующихся. На сим я закончу. Удачи.
Php coded by exe
Создание исполняемых приложений на PHP
Мы привыкли, что язык PHP используется для web-разработки, и в большинстве случаев это действительно так. Но при этом PHP обладает обширным арсеналом различных функций и инструментов, которые можно использовать не только в сайтостроительстве. Из PHP-скриптов можно делать полноценные приложения для Windows в виде привычных нам EXE-файлов. Для PHP4 в свое время были такие интересные штуки, как Roadsend Compiler Studio и Bambalam PHP EXE Compiler, которые делали из скриптов консольные приложения. Были даже такие инструменты, как PHP-GTK и WinBlider, позволявшие создавать на PHP программы с графическим оконным интерфейсом. Теперь, к сожалению, все эти проекты уже прекратили свое существование. Инструментов нет, но задачи никто не отменял! Значит надо искать какие-то новые решения.
Надо понимать, что язык PHP все-таки не подразумевает компиляцию, и все решения так или иначе представляют собой биндеры интерпретатора PHP с необходимыми библиотеками и самих скриптов, которые, собственно, и являются приложением. Из-за этого размер готового файла даже в упакованном виде получается слишком большим.
Для запуска PHP-скрипта на выполнение используется команда
php.exe -f скрипт.php
В ней заключается суть создания исполняемых приложений на PHP. Самый простой способ сделать подобие приложения на PHP — это использовать самораспаковывающийся архив RAR.
Создаем SFX-архив
Предположим, что наше PHP-приложение содержится в единственном скрипте index.php. Запускаем архиватор, создаем новый архив, добавляем в него файл скрипта, а из папки с установленным PHP берем два файла — php.exe и php5ts.dll. Если в скрипте не используются функции работы с сетью, графикой и т.п., то этого набора должно хватить. В параметрах архива ставим галочку «Создать SFX-архив».
Параметры SFX-архива
На следующей вкладке открываем дополнительные параметры архива.
Настройка параметров
В окне настроек проставляем галочки, как показано на скриншотах.
Настройка параметров
При таких настройках все содержимое архива автоматически будет извлекаться во временную папку, существующие файлы будут перезаписываться, никаких сообщений и подтверждений показываться не будет.
Настройка параметров запуска
Последним шагом прописываем, что после распаковки должен быть запущен интерпретатор PHP с нашим скриптом. Для большей изящности в настройках архива можно выбрать собственную иконку, которая будет у созданного приложения. Вот и все, создаем архив, запускаем его на выполнение. Скрипт запускается и отрабатывает как надо.
Если в скрипте используются функции из расширений, то придется подключить и их тоже. Для этого надо будет создать файл php.ini примерно такого содержания
[PHP]extension_dir = «.»
extension=php_curl.dll
и упаковать его вместе с расширениями в этот же архив. Вообще, такие комплекты удобнее всего собирать в отдельной папке, там можно сразу проверять работоспособность скрипта, а главное, наличие всех зависимых библиотек и расширений. Например, указанное расширение php_curl потянет за собой паровозом еще библиотеки libeay32.dll, libssh2.dll и ssleay32.dll, которые также придется включать в архив.
Несмотря на простоту создания, у таких приложений есть существенные недостатки. Во-первых, кто угодно может открыть архив, ознакомиться с его содержимым, даже внести какие-то свои коррективы. Во-вторых, SFX-архивы не обрабатывают в чистом виде параметры командной строки, надо изворачиваться со специфическими ключами типа -spпараметры>. Поэтому приложения на базе SFX-архивов обычно могут выполнять только какие-то фиксированные действия, не предусматривающие взаимодействие с пользователем.
Более удобный вариант для создания приложений из PHP-скриптов — это коммерческая утилита MoleBox. Она упаковывает целое приложение в контейнер в виде единого exe-файла. Вместе с основным исполняемым файлом в контейнер помещаются необходимые для его работы библиотеки и прочие файлы, что нам и нужно. Несколько лет назад проект MoleBox прекратил существование, но это не значит, что его больше негде взять (пароль на архив «manhunter.ru»).
Добавление файлов в проект
Запускаем оболочку MoleBox, добавляем в корень проекта уже знакомый нам набор файлов для запуска интерпретатора PHP и нужные скрипты, затем открываем настройки проекта.
Настройки проекта
В настройках проекта в качестве главного исполняемого файла выбираем php.exe, из него же будет извлечена иконка для результирующего файла. В параметрах командной строки указываем имя запускаемого скрипта и дополнительный ключ , который означает, что кроме имени скрипта надо ретранслировать на обработку параметры, переданные файлу приложения. Для работы с параметрами командной строки в PHP предусмотрены две предустановленных переменных. В целочисленной переменной $argc содержится количество переданных параметров, а в массиве $argv хранятся сами параметры.
После сборки проекта получаем единый исполняемый файл. Увы, без недостатков тут тоже не обошлось. По причине популярности MoleBox у малварщиков, некоторые антивирусы очень плохо относятся к таким сборкам, сразу записывая их в подозрительные. В остальном же это очень хороший способ создания исполняемых приложений из PHP-скриптов.