Visual PHP для Windows

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

Но что делать, если хочется чего-то большего? Если надоело писать однотипные классы для онлайн-казино, ковыряться в Joomla/Drupal/PHPBB очередного заказчика?
Думаю, что многих посещала мысль начать писать Windows программы на любимом языке PHP, но дальше поиска по интернету и поверхностного изучения таких библиотек как PHP-QT и PHP-GTK дело, как правило, не доходит. Почему? Все ответы схожи — запутанно, сложно, ненаглядно, непонятно и т.д. Но сегодня уже есть качественно новая и перспективная среда для визуальной разработки программ на PHP под Window и имя ей — DeveStudio.

Что же представляет собой DeveStudio?

Это полноценная визуальная среда программирования, которая позволяет создавать полноценные программы на языке PHP с поддержкой GUI. Теперь, для создания программ по Windows достаточно знать самый популярный язык программирования — PHP.

В этой статье я не буду описывать кнопочки и рюшечки этой среды разработки, не буду говорить о неких абстракных возможностях и не буду устраивать детский сад с написанием «Hellow Word».
Мы поверхностно рассмотрим процесс написания полноценной программы под Windows и остановим своё внимание только на интересных решениях, которые будут небезынтересны всем.

Предыстория

Итак, в один прекрасный вечер я в очередной раз зашел на сайт проекта «Denwer», с целью проверить не вышло ли там обновление. Но там ничего не оказалось, попрежнему я обнаружил лишь новую ругань в адрес разработчиков и обвинения в выклянчивании пожертвований и абсолютном бездействии.

Меня не покидало желание отказаться от Denwer и написать свою, действителньо удобную и полезную программу для организации локального веб-сервера. После недолгих поисков моё внимание привлекла среда разработки «DeveStudio». Она оказалось предельно удобной, понятной и самое удивительное — она открыла мне дорогу в мир Windows программ и я приступил к написанию «Open Server».

Написание программы

Сначала было создано 2 новых формы (Настройки и Просмотр логов) помимо основной, затем еще 3 вспомогательных (О программе, Ошибка и Первый запуск).
Так же во все формы были добавлены необходимые управляющие элементы, поля ввода, иконки и прочее. Всё это было сделано без единой строчки кода. Вот она мощь визуальной среды!

image

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

1. Стартовая функция (выполняется при загрузке программы)
Проверка на то, не была ли уже запущена программа

$output = shell_exec('tasklist /nh /fi "Imagename eq Open Server.exe"'); // получение списка процессов
$ret = iconv('CP866','CP1251',$output);
if (substr_count($ret,'Open Server.exe')>1) {
 c('trayIcon1')->enabled = false; // отключаем трей-меню
 LoadForm(c('message'), LD_NONE); // загружаем форму с сообщением об ошибке
}else{ ... }


Вот так, например, добавляются элементы в выпадающее меню

$mm = new TMenuItem;
$mm->caption = t("menu_9"); // t - это функция мультиязычности, здесь будет написано Выход
$mm->loadPicture("server/system/data/exit.bmp"); // подгружаем иконку
$mm->onClick = exitfunc; // функция выполняющая остановку сервера / выход из программы


А вот так удалось решить задачу с определением битности Windows и проверке на наличие установленных компонентов Microsoft Redistributable C++

if(getenv("PROCESSOR_ARCHITEW6432")=="AMD64" || getenv("PROCESSOR_ARCHITECTURE")=="AMD64"){
$output = shell_exec("REG QUERY HKLM\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"); // запрос в реестр
$ret = iconv('CP866','CP1251',$output);
if (substr_count($ret,'{86CE85E6-DBAC-3FFD-B977-E4B79F83C909}')<1 || substr_count($ret,'{a0fe116e-9a8a-466f-aee0-625cb7c207e3}')<1) {
 c('trayIcon1')->enabled = false;
 LoadForm(c('proc'), LD_NONE); // загрузка формы с предложением установить недостающие компоненты
}
}else{
$output = shell_exec("REG QUERY HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
$ret = iconv('CP866','CP1251',$output);
if (substr_count($ret,'{86CE85E6-DBAC-3FFD-B977-E4B79F83C909}')<1 || substr_count($ret,'{a0fe116e-9a8a-466f-aee0-625cb7c207e3}')<1 ) {
 c('trayIcon1')->enabled = false;
 LoadForm(c('proc'), LD_NONE); // загрузка формы с предложением установить недостающие компоненты
}
}


2. Форма просмотра логов
Здесь всё было предельно просто — чтение лог-файла и вывод содержимого в форму, но пришлось пойти на хитрость, чтобы сделать автоматическую установку курсора в конец списка (возможности среды этого не позволяют).

image

Вот как обрабатывается переключение табов и установка курсора в конец лога

$WshShell = new COM("WScript.Shell");
if (c("pages1")->pageIndex == 0) c("memo1")->setFocus(); // установка фокуса на текстовое поле
elseif (c("pages1")->pageIndex == 1) c("memo2")->setFocus();
elseif (c("pages1")->pageIndex == 2) c("memo3")->setFocus();
elseif (c("pages1")->pageIndex == 3) c("memo4")->setFocus();
elseif (c("pages1")->pageIndex == 4) c("memo5")->setFocus();
elseif (c("pages1")->pageIndex == 5) c("memo6")->setFocus();
elseif (c("pages1")->pageIndex == 6) c("memo7")->setFocus();
$WshShell->SendKeys("^{END}"); // нажатие клавиши END чтобы попасть в конец
$WshShell->SendKeys("{HOME}"); // Нажатие клавиши HOME чтобы вернуться в начало последней строки


Здесь можно холиварить о том, что установку фокуса можно написать через конструкцию switch-case, но разницы никакой нет, работает одинаково, а вариантов написания море. Статья не о красивости написания кода.

3. Форма настроек
image

Здесь так же было всё довольно просто

ini :: open("server/system/config.ini"); // открываем файл настроек
ini :: read("main", "lang", $lang); // читаем параметр

и
ini :: write("main", "lang", c("settings->combobox1")->inText); // сохраняем параметр


Но кое с чем, пришлось повозиться — это получение списка занятых дисков в системе.
Вот что получилось, это довольно интересно:

$fso = new COM("Scripting.FileSystemObject");
$disks = array();
foreach($fso->Drives as $disk) $disks[] = $disk->DriveLetter; // получаем массив дисков

$diskarr = array("D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
$diskar = array();
foreach($diskarr as $fffile) if($fffile == $os_vdisk){$diskar[] = $fffile;}else {if(!in_array($fffile,$disks)) $diskar[] = $fffile;} // если диск существует, то исключаем его из списка
c("combobox2")->text = implode("\n",$diskar);
$icounter = 0;
foreach($diskar as $fffile) {if($fffile == $os_vdisk) c("combobox2")->itemIndex = $icounter; $icounter++;}


4. Функция запуска локального сервера
Это самая объёмная функция, нужно было сделать перезапись конфигурации модулей по шаблонам, запустить виртуальный диск, запустить Apache, Mysql, FTP сервер и т.д., однако и тут DevelStudio и форум поддержки среды позволили мне реализовать всё задуманное. Далее несколько интересных моментов…

Легко и просто получаем путь до HOSTS файла

$hostsfile = winLocalPath(CSIDL_WINDOWS) . "/System32/drivers/etc/hosts";


Запускаем виртуальный диск (используется системная утилита subst.exe, получение локальной директории и пути до системной папки Windows)

Shell_Execute(0, 'open', 'subst.exe', $os_vdisk . ': "' . substr(realpath('./'), 0, strlen(realpath('./')) - 1) . '"', strtr(winLocalPath(CSIDL_WINDOWS).'/System32/','/','\\'), 0);


Запуск Apache (функция Shell_Execute позволяет запустить стороннюю программу в фоне и без ожидания ответа)

Shell_Execute(0, 'open', 'os-httpd.exe', '', $realospath . '\\server\\http\\' . $os_httpdriver . '\\bin\\', $os_window);


Как видите, с помощью PHP и DevelStudio мне удалось реализовать все поставленные перед собой задачи. Не обошлось без вызова компонентов COM, Shell и встроенных функций среды разработки. Получилась полноценная Windows программа написанная на языке PHP, точнее даже комплекс программ для организации веб-сервера на локальном компьютере, проект сейчас живёт и успешно развивается.

image

Заключение

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

Полезные ссылки:
Среда разработки Develstudio
Локальный веб-сервер Open Server


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.