В Composer нет штатного инструментария для работы с ресурсами/asset.
Есть несколько более-менее популярных решений со своими достоинствами и недостатками.
libra/libra-assets-installer — умер и оживлению не подлежит.
robloach/component-installer — отлично подходит для раздачи собственных ресурсов. Но задача чаще стоит в том, чтобы подключать сторонние пакеты, в первую очередь — bower. Можно, конечно, собирать свои сборки, даже автоматизировать процесс, но придётся постоянно следить за выходом новых версий. Когда пакетов становится хотя бы десяток, это уже утомительно.
Есть средства для работы напрямую с bower-asset:
fxp/composer-asset-plugin — очень популярное решение, отчасти из-за простоты использования, отчасти из-за использования в Yii. Минус в очень долгой работе и необходимости первого глобального включения (или в новых версиях composer/plugin стали такое разруливать? — давно не натыкался на ошибку зависимостей, но специально руки не доходили проверить). Главный же для меня минус — это то, что пакет из bower тянется целиком. Со всеми исходниками, примерами, документацией... Иногда они занимают место в десятки раз больше, чем сами рабочие файлы .min.js/.min.css... И всё это вываливается на боевой сервер!
asset-packagist.org — практически то же самое решение, даже совместимое по форматам, только требует указания отдельного репозитория, что в дополнительный минус, но работает быстро, что в плюс. Главный же минус загрузки уймы мусора остаётся таким же.
Так вот, у меня возникает вопрос. Может, я что-то упустил? Может, есть решения, типа fxp/composer-asset-plugin/asset-packagist.org, но позволяющие на уровне пакета (не composer.json проекта!) указать дополнительно, какие файлы и каталоги нужно реально задействовать из bower-пакета? Или есть какое-то решение третьего типа?
Даже если размер «файловой базы» будет в считанные килобайты — и то БД будет уже быстрее. В случае мегабайтных размеров разница в скорости будет вообще несопоставимая.
Пощупал на тестах. Понравилось — действительно высокая скорость работы и есть параллелизация (на тестовом ноуте с i3 выдаёт 500 rps в один поток и 1400 rps в четыре потока).
Не понравилось — не перезагружает контент при изменении файла (в отличие, скажем, от встроенного в PHP сервера — но тот однопоточный).
И, главное, не понял, как реализовать неблокируемость. Ставлю перед HelloWorld паузу — все последующие запросы ждут, пока выполнятся предыдущие и только тогда начинают отрабатывать свою паузу… Есть подозрение, что я на уровне теста что-то не так готовлю
А, может, есть у кого-нибудь мысли, как сделать асинхронным встроенный web-сервер?
Ну, обмен данными — это не вопрос, я тоже на сигналах делал обмен, когда gearman-демона делал.
Тут вопрос именно в проблеме запуска, обмениваться данными процессам после запуска не требуется.
Я сейчас решил задачу костылём. Использую первый вариант (интеграция PHP-скрипта в bash-скрипт), а мусор вычищаю вызовом ob_end_clean(); в начале PHP-части:
С одной стороны, работает, при чём быстро, удобно и как требуется, с другой — всё равно костыль. Так что если кто предложит более изящное решение, то буду рад
Периодически возникает задача сделать интерактивное приложение под 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-сервер.
Есть у кого-нибудь мысли, как решить первую или вторую проблемы?