Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Консольные интерактивные приложения на PHP под Linux.
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
Периодически возникает задача сделать интерактивное приложение под PHP. Обычно делается всё тупо и некрасиво — echo/fgets. Есть, понятно, и готовые библиотеки на этот счёт, но там, в общем-то, всё также некрасиво.
Следующая мысль — сделать что-то на ncurses. Но придётся делать целую прослойку для стандартных элементов интерфейса и взаимодействия их с приложением. Тоже долгая история. Но на её пути родилась такая цепочка. Для языка разметки форм хорошо бы задействовать тот же HTML → Надо писать хотя бы примитивный парсер форм → Хорошо бы для этого задействовать уже имеющиеся консольные браузеры → Консольный браузер итак может показывать HTML-страницы, выданные скриптом и отсылать запросы в него же, при этом в PHP5.4 появился неплохой встроенный Web-сервер.
И, вот, основная идея готова. Скрипт запускает web-сервер, потом — консольный браузер с запросом к этому серверу. Работаем привычно, как с любым Web-приложением, когда завершаем работу и выходим из браузера, сервер убивается. Получается удобно, красиво (для консоли) и без велосипедостроения.
А вот на практической реализации уткнулся в проблемы.
Хочется иметь автономный запускающий скрипт. С состоящим из двух частей — никаких проблем. Например, bash-запускалка и php-роутер, который проинициирует систему. Но удобно, когда скрипт один. Соответственно, в голову приходит два варианта:
— Комбинированный скрип, запускающийся как bash, продолжающийся как php. Ну, грубо говоря (концепт):
Этот вариант прекрасно работает, но, увы, мусорит на экран двумя хэшами. Я так и не поборол пока эту проблему.
Следующий вариант более «полноценный». Всё засунуть целиком в нормальный PHP-скрипт, из него запустить фоновым процессом php с web-сервером, запустить браузер, после выхода из последнего — всё за собой подчистить. Тут вылезла другая проблема. Единственный способ запустить браузер интерактивно, который я нашёл — это pcntl_exec(). Во всех остальных случаях он тупо ждёт ввода, ничего не выводя на экран, пока его не прибить (пробовал lynx, links, w3m).
Кроме того, возникали постоянные проблемы с работой фонового web-сервера, пока не засунул его запуск в pcntl_fork(). Текущий вариант такой:
Тут вылезла другая проблема. Всё отлично работает, пока не сделаешь выход. После выхода из браузера php-скрипт вываливается, не доходя до выполнения убийства web-сервера. Если после pcntl_exec("/usr/bin/lynx") поставить логгирование в файл, то оно никогда не вызывается. Соответственно, после выхода из браузера мы оказываемся в консоли, но у нас в фоне остаётся запущенный web-сервер.
Есть у кого-нибудь мысли, как решить первую или вторую проблемы?
DeepVarvar
Отправлено: 15 Апреля, 2013 - 18:52:36
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
Ну, обмен данными — это не вопрос, я тоже на сигналах делал обмен, когда gearman-демона делал.
Тут вопрос именно в проблеме запуска, обмениваться данными процессам после запуска не требуется.
Я сейчас решил задачу костылём. Использую первый вариант (интеграция PHP-скрипта в bash-скрипт), а мусор вычищаю вызовом ob_end_clean(); в начале PHP-части:
С одной стороны, работает, при чём быстро, удобно и как требуется, с другой — всё равно костыль. Так что если кто предложит более изящное решение, то буду рад
DeepVarvar
Отправлено: 15 Апреля, 2013 - 19:29:57
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.