Shader
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Суть задачи: - Из веб-приложения необходимо запускать CLI-скрипты и выполнять команды.
- CLI-скрипт должен возвращать данные о процессе выполнения и обновлять прогресс-бар. Получается, нам необходим механизм реализации IPC (inter-process communication), который позволит запускать скрипты из командной строки вне зависимости от того, на каком языке они написаны.
Ход размышлений: - Решение в лоб - использовать именованные каналы (pipe), но они работают, как fifo, поэтому единожды получив из них данные, можно повторно получить пустой ответ, если второй процесс ничего не успел сделать за итерацию.
- Писать статусы в файл и читать последнюю строку - топорно. Выбор пал на Server-sent Events (SSE), что исключает Internet Explorer из списка совместимых браузеров, но невелика потеря.
Решение: - Определяемся с форматом скрипта - скрипт построчно рапортует о процессе выполнения, соблюдая формат "DD# SS", где DD - прогресс выполнения в процентах, # - разделитель, SS - строка с текстом сообщения. Символ процента использовать нежелательно, т.к. CMD резервирует его под переменные.
Пример CMD-скрипта Пример SH-скрипта Пример Python-скрипта - Javascript-библиотека, вешающая обработчики addEventListener
Исходный код - Собственно, сам IPC-бэкенд, написанный на PHP и обёрнутый в класс
Исходный код - Создаём кнопку и вешаем на неё вызов IPC.startTask()
Дополнительная информация: - Парсер, похоже, съедает отступы в коде. Простите -_-
- Вся эта радость может работать, как с CLI-скриптами, так и с консольными командами. Исходники в примерах обрезаны для сокращения объёма, но модифицировать их несложно.
- Ничто не мешает получать данные не из CLI, а выполнять какую-то долгую процедуру в рамках обычного PHP-скрипта.
- Вырезана часть проверок, опять же для сокращения кода. Также вырезан обработчик beforeunload, страхующий пользователя от случайного прерывания выполнения. Убрана универсальность IPC.js, чтобы опять же сократить код.
Имеет ли подобное решение право на жизнь? Есть ли более лаконичный и логичный способ работать с CLI-скриптами, реализуя условную независимость от платформы? |