Как общаться между HTTP-запросом и объектами класса cli

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

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

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

Кли приложение работает веб-сокеты. В общем, я хочу, чтобы http и сокеты общались через. http api.

Ps:

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

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

1 ответ

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

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

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

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

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

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

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

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

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

Для вашего веб-приложения инициировать подключение веб-сокета к приложению cli немного сложнее, потому что я не знаю никакой нативной функциональности PHP, которая специально нацелена на протокол веб-сокета. Тем не менее, я нашел этот (чрезвычайно разрешающий) проект github, который дает вам возможность настроить сервер веб-сокетов, а также включает в себя клиентский скрипт, который вы можете использовать для подключения и отправки / получения данных во время вашего веб-приложения. Процесс жизни, а затем выключите его, когда вы закончите. Похоже, что он все еще имеет минимальную активность, вы можете использовать его напрямую или использовать его в качестве отправной точки для написания своего собственного клиента websocket.

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

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

Другие вопросы по тегам