LINUX.ORG.RU

Мне кажется, исходя из формы в которую вы облачили вопрос, вам вероятно нужно в php-скрипте посредством exec дёргать экзешник с json-строкой в качестве параметра. Ну и получать ответ в $output, как указано в документации.

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

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от a-lexx

если это web, то быстрее всего гонять каким нибудь бинарным протоколом между php-fpm и c++ демоном посредством unix сокета. сочетание же php + json + exec это маразм.

Anoxemian ★★★★★
()
Ответ на: комментарий от a-lexx

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

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

т.е завести табличку в мускуле. В таблице четыре поля: «id», «request», «response», «state». В таблицу php-скрипт пишет свой запрос и ставит status=«waiting». И засыпает.

Демон переодически проверяет табличку, если находит запрос со статусом вейтинг, то переводит статус в «processing», считывает запрос, обрабатывает, формирует ответ и обновляет строку ставя response=«json-ответ», state=«ready».

php-скрипт периодически просыпается и проверяет статус своего запроса (по id). Если статус не равен реди, то опять засыпает. Если реди, то считывает ответ и удаляет запись из таблицы.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

сочетание же php + json + exec это маразм

Смотря по ситуации. Если например нужно просто попробовать как оно будет, то вполне себе вариант. Или если с++ часть уже написана и принимает запрос в виде аргумента командной строки, к примеру.

А так сказать что то сложно - на вкус и цвет фломастеры разные. Надо отталкиваться от задачи и глядеть конкретику.

AndreyKl ★★★★★
()
Ответ на: комментарий от Anoxemian

Да, это web, и как раз php-fpm стоит на сервере. А вот этот с++ демон есть готовый, который будет слушать unix-сокет, типа php-fpm для php, или aiohttp для python, но для с++?

a-lexx
() автор топика
Ответ на: комментарий от AndreyKl

Это циклы проверки самому писать? Боюсь, повешу проц)) Или считывание с определенным лагом будет, а нужно, чтобы считывание мгновенное было сразу при поступлении данных. Мб, готовый демон с++ есть, прослушивающий unix-сокет?

a-lexx
() автор топика
Ответ на: комментарий от a-lexx

епт. так это ты задачу формулировал. у тебя же есть программа на с++? ну и перепиши чтобы она не в stdin json ловила, а в сокет какой-нибудь protobuf

Anoxemian ★★★★★
()
Ответ на: комментарий от a-lexx

Считывание без лага в php организовать вряд ли получиться, если я верно представляю задачу. Вообще без лага - это надо использовать какое то хитрое пробуждение. Типа по сигналу. Или может быть запускать нужный пхп-скрипт из демона... это не выглядит простым для пхп. По крайней мере я не могу на вскидку предложить вариант. Может быть кто то другой предложит. Но и тут будет лаг - ведь чтобы запустить процесс нужно некоторое время. Хотя лаг будет много меньше чем 0.1 секунды, скажем.

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

Если требования жестче, то лучше их озвучить, кмк.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 2)

есть вариант разработать расширение на плюсах - есть либа и описание методик создания расширений для php на c++

anonymous
()
Ответ на: комментарий от AndreyKl

т.е завести табличку в мускуле.

Тогда уж rabbitmq и гулять так гулять.

crutch_master ★★★★★
()

А что ты собираешься делать с финальным жсоном?

ya-betmen ★★★★★
()
Ответ на: комментарий от a-lexx

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

AndreyKl ★★★★★
()

Лага не должно быть не со стороны php, а со стороны с++

Обрисую задачу подробнее. Php соберет необходимые данные из разных источников (в том числе из бд) и оформит их для отправки в с++. Оформить можно, например, в json, или в бинарные данные, как тут советуют. Отправляет их в сокет. А вот далее без всяких задержек нужно считывание со стороны с++ из сокета. С++ делает вычисления, и в определенном формате отправляет результат обратно в сокет, где их php и забирает. Ну это также, как php отправляет запрос базе данных на unix-сокет, и получает из него ответ. Вопрос в том, есть ли уже готовый «слушатель» сокета на с++? А я напишу прогу на с++, которая будет заниматься непосредственно вычислениями, а запускаться, получать данные, отправлять их, она будет через этого «слушателя».

a-lexx
() автор топика
Ответ на: комментарий от AndreyKl

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

a-lexx
() автор топика
Ответ на: комментарий от a-lexx

Дело как бы ваше.

Цикл состоит из банального «проверить есть ли подключение», «если есть - акцепт, обрабатываем (возможно, отдаём другому потоку), начинаем сначала», «если нет подключений - заснуть на столько то и начать сначала».

Я к тому что какой то лаг будет и при прослушке сокета и зависит он в первую очередь от таймаута.

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

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.