Какой самый простой способ сделать межпроцессное взаимодействие в PHP?

Я написал программу на PHP, которая постоянно обновляет базу данных. Я бы хотел, чтобы он выдавал данные во время работы, чтобы другие процессы могли их читать и что-то с ними делать.

Вот что я имею в виду на схеме:

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

Вот два возможных решения, которые я придумал:

<сильный>1. Включите основной процесс на сервер Unix Socket.

Я мог бы добавить некоторый код сокета в основной процесс, чтобы превратить его в сервер сокетов Unix, обрабатывая соединения и записывая в сокет во время его работы. Затем другие процессы могут подключаться и читать данные из сокета:

Однако это означает, что основной программе придется иметь дело как с сервером сокетов, так и с выполнением своей основной работы. Кроме того, PHP не поддерживает многопоточность «из коробки», что несколько усложняет обработку нескольких соединений, и поэтому вся программа становится намного сложнее.

В общем, это не самое простое решение, особенно для программы, написанной на PHP (к сожалению).

<сильный>2. Создайте отдельный сервер Unix Socket.

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

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

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

Есть ли более простое решение?

Вариант 2 пока является моим предпочтительным решением, но может быть, есть какой-то альтернативный метод, который я здесь упустил?

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

Какие есть простые решения для такого рода межпроцессного взаимодействия?


person inersha    schedule 17.11.2018    source источник
comment
Redis имеет привязки к PHP и клиенты на C/C++, Python, bash и т. д. Вы можете использовать Pub/Sub, очереди, хэши и множество других структур данных.   -  person Mark Setchell    schedule 18.11.2018
comment
Я использую Redis для этого. Он может хранить данные, списки и многое другое. Он также может публиковать и подписываться. Конечно, есть много других решений.   -  person ryantxr    schedule 18.11.2018
comment
Спасибо @MarkSetchell и ryantxr, Redis выглядит как отличное решение для того, что я хочу.   -  person inersha    schedule 18.11.2018


Ответы (2)


Вы ищете что-то вроде ActiveMQ, это позволит вам «опубликовать» ваши данные в очереди (очередях), тогда вы можете иметь другие сценарии/процессы в качестве подписчиков этой очереди. По сути, подписчики будут извлекать данные по мере их поступления. Это очень настраиваемый и простой в использовании для распространения данных.

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

Apache ActiveMQ

PHP Stomp

person von Stack    schedule 17.11.2018

похоже, что все, что вам нужно, это база данных SQLite :) выплевывать данные в базу данных SQLite и не использовать транзакцию (или делать ваши транзакции очень недолговечными) и заставлять заинтересованные программы читать файл базы данных ~

person hanshenrik    schedule 17.11.2018
comment
sqlite вообще не подходит. он не предназначен для этой цели, неэффективен. memcached был бы намного лучше, но это все еще довольно накладно. - person John; 09.01.2019