Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »
реклама
Качественная разработка мобильных приложений по ссылке. Звоните!

Почтовая рассылка

Подписчиков: 11829
Последний выпуск: 19.06.2015

Создание EXE приложений на PHP

Автор: S1B aka Furius Angel (Security Bunker Team)
www.secbun.info

INTRO

Все мы знаем что PHP предназначен для быстрого создания динамических Web страниц. Во всяком случае именно это написано на официальном сайте разработчиков PHP. Однако почему бы не попробовать найти PHP "немного" иное применение, например, попробовать создать полноценное приложение для Windows? Заинтересовал? Тогда понеслась!

Чёрный квадрат

Приложения делятся на консольные и оконные. Начнём с создания первых, так как это проще. Итак, для начала нужно определиться с тем, что мы будем писать... я предлагаю написать простой MD5 & Base64 Encoder - вещь в хозяйстве нужная и полезная, тем более здесь всё достаточно просто. Для запуска PHP скрипта из командной строки и передачи ему нужных параметров используется следующая конструкция:

php.exe [опции] [-f]  [параметры]

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

Чтобы не утруждать Вас написанием скрипта, я решил написать его за Вас. Вот что у меня получилось:

<?php
if($argc!=3) { echo "
+--------------------------------------+
|  Create MD5 hash: enc md5 string     |
|  Create Base64 hash: enc b64 string  |
+--------------------------------------+\n";
} else {
echo "\n";
 if($argv[1]=='md5') { // MD5 encode
  echo md5($argv[2])."\n\n"; die();
  }
  if($argv[1]=='b64') { // Base64 encode
  echo base64_encode($argv[2])."\n\n"; die();
  } else { echo "Unknown command. Type \"enc\" for help.\n\n"; }
}
?>

Скрипт написан и теперь самое интересное - компиляция в 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 такими глюками не страдает, поэтому рекомендую использовать её. Теперь щедро выделяем для нашего компилятора отдельную папку, заходим в командную строку и гордо командуем:

bambalam -w -c C:\PHP_Projects\MD5_Hash_Generator\ md5.phpw md5.exe

Если всё сделано правильно, то в директории с компилятором будет лежать свежесколоченое оконное приложение. Всё. Добавлю лишь, что все приложения я ещё рекомендовал бы упаковывать UPX`ом (который идёт сразу с Bamcompile).

Волшебный ларец

Все вышесказанное конечно весьма интересне и познавательно, однако бывают моменты когда нужных инструментов под рукой нет... Что делать тогда? Специально для такого случая есть один весьма любопытный приём получения EXE через шаманство в опциях SFX архива WinRAR. В качестве примера я буду использовать наш первый скрипт для консоли. Для начала помещаем наш скрипт в отдельную папку, туда же копируем php.exe и php*ts.dll. Далее создаём в этой же папке run.bat следующего содержания:

@echo off
php.exe -q console.php %1 %2

Теперь нам необходимо это добро упаковать, для этого выделяем все файлы, жмём правой кнопкой и выбираем "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, а данная статья лишь неплохое подспорье для пхп кодеров и всех интересующихся. На сим я закончу. Удачи.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
57K
16 января 2010 года
timurik
0 / / 16.01.2010
+3 / -5
Мне нравитсяМне не нравится
16 января 2010, 13:44:02
что то я я не папрнил
2.
41K
03 августа 2008 года
diskat
0 / / 03.08.2008
+7 / -0
Мне нравитсяМне не нравится
3 августа 2008, 19:10:26
Эх.. после 200 инклюдов и 15 минут компиляции узнать что sha1() еще не поддерживается.. можно было и предупредить..
3.
41K
03 августа 2008 года
diskat
0 / / 03.08.2008
+1 / -7
Мне нравитсяМне не нравится
3 августа 2008, 19:09:06
Эх.. после 200 инклюдов и 15 минут компиляции узнать что sha1() еще не поддерживается.. можно было и предупредить..
4.
41K
03 августа 2008 года
diskat
0 / / 03.08.2008
+0 / -5
Мне нравитсяМне не нравится
3 августа 2008, 19:08:53
Эх.. после 200 инклюдов и 15 минут компиляции узнать что sha1() еще не поддерживается.. можно было и предупредить..
5.
11K
02 июля 2005 года
Dir
8 / / 02.07.2005
+3 / -0
Мне нравитсяМне не нравится
13 февраля 2008, 00:57:23
скачал WinBlider, установил...но при запуске php-win.exe выдает ошибку -
"Точка входа в процедуру _zval_copy_ctor_func не найдена в библиотеке DLL php5ts.dll"
"PHP Startup: Unable to load dynamic library 'C:\PHP\ext\php_mssql.dll' - Не найдена указанная процедура"

и потом покругу теже ошибки только указаны другие процедуры - zend_std_get_constructor - php5ts.dll
php_mysqli.dll
_zval_copy_ctor_func - php5ts.dll
php_gettext.dll
php_gmp.dll
php_filepro.dll
php_mbstring.dll
_safe_malloc - php5ts.dll
php_pdo.dll
php_sqlite.dll
php_dbase.dll
php_dbx.dll

Не подскажете в чем проблема и как исправить.
У меня стоит php 5.2.4 под апатчем, сам он прекрасно работает
спасибо
6.
35K
29 декабря 2007 года
ko1yan
0 / / 29.12.2007
Мне нравитсяМне не нравится
29 декабря 2007, 18:15:00
При нажатии на Project -> Build выдаёт ошибку
binary is not set

в чём проблема?
7.
34K
16 ноября 2007 года
oskin
0 / / 16.11.2007
Мне нравитсяМне не нравится
16 ноября 2007, 14:23:03
Интересно. Создавать оконные приложения действительно можно, но очень уж простые.
На подобие вышеприведенного примера.

В комплекте Winbinder идет formeditor тоже написанный на php.

Попробовал поработать с пол часа, ужаснулся от файла - подкачки, который раздулся до 1,7 Гб. Так же пытался написать календарь - ежедневник, то же черезмерное использование ресурсов.
Буду смотреть на PHP-GTK
8.
29K
20 апреля 2007 года
S1B
0 / / 20.04.2007
Мне нравитсяМне не нравится
20 апреля 2007, 22:02:18
Спасибо за комент. Теперь пользователи точно разберутся ;)
9.
13K
02 марта 2006 года
dimon7k
18 / / 02.03.2006
+1 / -1
Мне нравитсяМне не нравится
10 апреля 2007, 20:49:17
Вообще для создания работоспособных экзешников биндеровских десктопных приложений с помощью bamcompile 1.21, как я понял, в проект надо подключать библиотеку php_winbinder.dll. Тогда все ОК (по крайней мере скрипт, приведенный в статье, прекрасно пашет).
И, как пишется в readme bamcompile-архива, фишкой этого компиллятора, начиная с версии 1.2, является возможность подключения к проекту дополнительных библиотек, что было недоступно ранее. Так, можно написать биндеровский (рнр-шный) скрипт, прекрасно работающий с библиотекой gd_2, но после создания соответствующего экзешника с помощью bamcompile 1.1, в приложении будут недоступны графические функции; в версии же bamcompile 1.21 указанную gd_2-библиотеку можно подключить к проекту, и полученный экзешник уже будет выполнять соответствующие графические функции.
А вообще смотрите примеры папки examples bamcompile-архива - можно найти что-то полезное (в плане того, ка как задавать создание єкзешника).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог