Статья написана для Windows, но актуальна и для Linux, достаточно установить PHP, выполнить в терминале команду из папки приложения и всё будет работать, для Windows достаточно кликнуть один ярлык.
Вы сразу спросите почему PHP, почему не Electron или Python, да все потому что нет времени изобретать что-то новое, если логика уже реализована в админке сайта например, или же уже сформирована достаточная кодовая база на PHP, если нужно разработать новое приложение, тогда да, можно его писать на чем-то с нуля, но тут просто скопировал, вставил, запаковал в архив и пользуйся.
Графическим интерфейсом для проекта будет тот же веб-сервер, достаточно в bat-скрипте после запуска сервера вписать открытие например localhost:10000 и готово. В идеале можно взять портативный браузер, сконфигурировать его правильным образом и запускать с правильными параметрами, чтобы не было никаких панелей, только окно сайта, но об этом позже вероятно расскажу.
В качестве веб-сервера будет использоваться тот, что встроен в PHP, ради однопользовательского приложения можно не ставить Apache или Nginx.
В качестве хранилища данных можно использовать файлы или SQLite, это по сути тот же MySQL, только чуть проще и не нужно отдельный сервер запускать, приложение просто дергает файл и оперирует данными из него.
Итак, начнем, создаем папку, например, WebTool, в этой папке создадим папку BIN и положим туда распакованный PHP для Windows, в моем случае это 7.4.10

Внутри WebTool, рядом с BIN создадим APP, там будет наше веб-приложение..

Но внутрь BIN мы положим еще один файлик, хоть он и php, но будет этаким роутером, вместо .htaccess и веб-сервера.
Назовем его server.php и положим в папку BIN

<?php
//echo $_SERVER['REMOTE_ADDR']; exit();
//if($_SERVER['REMOTE_ADDR']!='::1') exit("ONLY LOCAL");
$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$ext = pathinfo($path, PATHINFO_EXTENSION);
$__DOC = $_SERVER["DOCUMENT_ROOT"];
$__full = realpath($__DOC . $path);
$path = rtrim($path,"/");
// все php и несуществующие пути обрабатываем приложением
if ((!is_file($__full) || $ext=='php')|| empty($path))
include $__DOC.'/run.php';
//остальное, типа картинок отдаем пользователю напрямую
else
return false;
А в папку APP положим пока просто файл run.php c текстом типа
<?php phpinfo();

Теперь первый тестовый запуск, в папку WebTool создадим файл start.bat
С таким содержимым важно путь до PHP правильный
start /MIN "WebTool" BIN\php-7.4.10-x64\php.exe -S localhost:10000 -t APP\ BIN\server.php
start "" http://localhost:10000
Достаточно будет кликнуть по start.bat и у нас откроется наше веб-приложение в браузере, а перед этим запустится сервер, тут нужно будет доработать, чтобы он дважды не запускался, но это потом... Дважды он итак не запускается, при втором запуске строчка с php не выполняется, выдает ошибку, а строчка с открытием странички в браузере срабатывает...
Чтобы остановить сервер - нужно закрыть свернутый терминал с сервером!
Если все правильно, то в браузере увидим примерно такую старничку

Дальше нам нужно привести в порядок php.ini, копируем внутри папки BIN/php-xxxx/
файл php.ini-development
переименовываем копию в php.ini
Наводим порядки в файле, можно удалить всё лишнее, все равно это можно достать из оригинального файла из которого скопировали, у меня получилось типа такого:
[PHP]
engine = On
short_open_tag = On
precision = 14
output_buffering = 4096
;output_handler =
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
zend.exception_ignore_args = Off
expose_php = On
max_execution_time = 120
max_input_time = 60
memory_limit = 1280M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 800M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
extension_dir = "ext"
enable_dl = Off
file_uploads = On
;upload_tmp_dir =
upload_max_filesize = 800M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
extension=bz2
extension=curl
extension=ftp
extension=fileinfo
extension=gd2
extension=intl
extension=imap
extension=mbstring
extension=mysqli
extension=oci8_12c
;extension=odbc
extension=openssl
;extension=pdo_firebird
;extension=pdo_mysql
extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
extension=sockets
extension=sqlite3
[CLI Server]
cli_server.color = On
[Date]
date.timezone = UTC
[bcmath]
bcmath.scale = 0
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[mbstring]
mbstring.language = Russian
mbstring.internal_encoding = UTF-8
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
; A default size of the shared memory segment
;sysvshm.init_mem = 10000
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
opcache.revalidate_freq=5
opcache.save_comments=0
Перезапускаем сервер, дальше делаем этакое приложение, сразу скажу, у меня с прошлой работы очень много наработок завалялось, из этого начнем лепить приложение, итак, что нам нужно?
1. Парсер URL для подгрузки нужных модулей
2. Система работы с модулями, систему контроля доступа можно упустить.
3. Базовая библиотека с обертками для выполнения типовых операций и работы системы.
4. Простенький шаблонизатор, чтоб не мешать логику и представление.
5. Контроллер для модулей.
6. UI-библиотека, состоящая из php+css+js, чтобы в пару строчек слепить форму...
7. Всякие классы типа для работы с БД...
Можно по идее взять готовый фреймворк, но я обойдусь несколькими файлами.
Если вам тема интересна - заходите в мою группу в вк, подписывайтесь, пишите в личку, на почту.
Сверху есть ссылка поддержать проект, если вдруг захотите.