2016-04-25 2 views
4

У меня есть приложение, выполняющее это перечисление в HTTP-запрос. Каждый запрос передается на одну страницу, где создается объект рамки $app, и это заботится о маршрутизации/контроллере/модели и т. Д.Как общаться между объектами HTTP-запроса и класса cli

Теперь у меня есть другой класс, объект которого создается через. скрипт CLI позволяет назвать его $cliApp. Теперь проблема в том, как заставить оба объекта разговаривать друг с другом. $app - это экземпляр, каждый раз возникает новый запрос.

Но $cliApp экземпляр только один раз, когда скрипт запущен. Этот скрипт работает в цикле через объект $loop по PHP React Event loop.

Приложение Cli работает с веб-сайтами. Так что в основном я хочу http & сокетов для связи через. http api.

P.s. :

Прямо сейчас у меня есть одно решение для использования очереди сообщений, например. 0mq и т. Д., Но это кажется излишним, поскольку я не смотрю на масштаб и не делаю его простым.

Другое решение, которое я сейчас пытаюсь и считает правильным, состоит в том, чтобы совместно использовать SptStorageObject между потоками, созданными $http запросом и потоком, созданным запросом $cli. Возможно, это вопрос об инъекции зависимостей, и у меня возникли проблемы с этим объектом $store.

+0

Каждый запрос к вашему приложению запускает новый поток на сервере. CLI делает то же самое. Темы в PHP никогда не делят ничего. Для обеспечения связи вам нужна система обмена сообщениями. Таким образом, вы на правильном пути. – colburton

+0

Я не совсем уверен, понимаю ли я, сколько процессов выполняется здесь. В основном, вы запускаете один экземпляр PHP-процесса (отредактируйте http-сервер) и $ cliApp WITHIN? или есть несколько случаев появления php здесь? – Method

+0

@Method Я просто использую React Event Loop & Ratchet Websockets. HTTP-запрос поступает с другой структурой, то есть с использованием компонентов symfony/silex. – kishanio

ответ

3

Если я правильно понимаю, у вас есть (отмеченное предположения):

  • обычный веб-приложение PHP, который осуществляет связь по протоколу HTTP (предположительно на Apache или аналогичный веб-сервер)
  • интерфейса командной строки приложения затянувшийся PHP, что обменивается данными через websockets.

Предполагается, что оба приложения постоянно получают связь от веб-клиентов. Предположительно, у них также есть свои постоянные хранилища данных, такие как база данных MySQL или аналогичная, возможно, даже совместная с ними.

Я собираюсь предположить, что то, что вам нужно, выходит за рамки каждого приложения, получая доступ к самым современным данным из постоянного хранилища данных (или что эти два процесса используют отдельные хранилища данных), и вам действительно нужно, требуют обмена данными между двумя процессами.

Вы находитесь на правильном пути с очередями сообщений, но, как вы заметили, излишняя сложность заключается в добавлении третьего выделенного уровня взаимодействия между процессами, когда у вас уже есть два уровня коммуникации, которые отлично работают сами по себе.

Что вам нужно, чтобы ваше приложение cli говорило по HTTP, когда ему нужно инициировать общение с вашим веб-приложением, а для вашего веб-приложения - говорить о веб-сокетах, когда ему нужно инициировать общение с вашим приложением cli.

Как это выглядит на практике довольно просто.

В вашем приложении cli просто используйте cURL, чтобы инициировать HTTP-соединение с вашим веб-приложением. Это довольно просто, в Интернете есть бесконечные ресурсы, которые помогут вам на этом пути, и если вы застрянете, то сюда придет новый вопрос, связанный с вашей проблемой, и вы пойдете.Все это требует в вашем веб-приложение выглядит следующим образом:

  • соответствующей конечной точки (ы), который приложение кли может посылать запросы, если основной клиент развороте не будет достаточно
  • некоторый метод аутентификации консоли приложение, если ему необходимо получить доступ к данным, которые не должны быть доступны веб-клиентам.

Для вашего веб-приложения, чтобы инициировать подключение к веб-соединению с приложением cli, это немного сложнее, потому что я не знаю ни одного родного PHP функциональность, которая специально нацелена на протокол websocket. Тем не менее, я нашел this (extremely permissive) github project, который призван дать вам возможность настроить сервер веб-сокетов, а он also includes a client script, который вы можете использовать для подключения и отправки/получения данных во время процесса вашего веб-приложения, а затем отключите его, когда вы «Сделано. По-видимому, он по-прежнему обладает минимальной активностью, вы можете использовать это напрямую или использовать его в качестве отправной точки для написания своего собственного клиента websocket.

В этом случае, как и в обратной ситуации, клиенту cli необходимо распознать и аутентифицировать трафик от вашего веб-клиента, чтобы он мог обслуживать соответствующие данные именно для него.

Если по какой-либо причине этот сценарий не сработает для вас, вы вернетесь в очереди сообщений или в хранилища общих данных (кто-то предложил redis, который может действовать как гибридное хранилище данных/очередь сообщений при некоторых обстоятельствах).

Смежные вопросы