Взаимодействие приложения на PHP с модулем на C. Как «правильней»?

Имеющаяся ситуация: Есть приложение на PHP, где один из существующих модулей с нагрузкой не справляется (расчёт взаимодействия десятков тысяч объектов в несколько — до десятков — итераций не укладывается во время не более нескольких секунд). Принято решение переписать его на C, найден открытый модуль для схожего проекта, там взаимодействие идёт путем создания текстового файла с исходными данными задания, передачей имени файла в параметре exec, и выдачей сериализованных результатов в тот же файл. Обработка условно синхронная — пользователь получает ответ с обработанным событием, если событие наступило на момент GET запроса или получает пустой ответ. Определением времени, подготовкой входных и обработкой выходных занимается PHP, Все данные берутся из БД (MySQL), туда же помещаются (частично в html — отчёт), на C только тяжелые расчёты. Что-то меня такой механизм смущает, прежде всего exec в каждом запросе и не очень нужный обменом с диском — и того, и другого обычно инстинктиво избегаю, как могущее вызывать серьезные проблемы с безопасностью.


Есть идеи написать демон, слушающий сокет, с которым php будет общаться, посылая задания и получая ответ, или использовать нечто вроде Gearman/RabbitMQ, в который php будет ставить задания, демон на Си брать и обрабатывать, а php ждать ответа. Можно ещё написать модуль на PHP, введя необходимые функции или классы прямо в PHP, чтобы забить на межпроцессное взаимодействие вообще, но даже ориентировочно трудоемкость не представляю.


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


Может кто-то предложит лучший вариант? Или просто пока забить и оставить до тех времен пока реально exec и работа с ФС не станут узким местом?
  • Вопрос задан
  • 4008 просмотров
Пригласить эксперта
Ответы на вопрос 3
@schroeder
посмотрите в сторону SWIG. У нас работает, все довольны. Никаких баз данных, никаких чтений из файла.
Ответ написан
Комментировать
@rowdyro
Самый правильный выход — писать демон, общаться с ним из пхп по tcp например через protobuffers.

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

Такая схема работы у очень многих систем — sphinxа например.

Так же еще есть fastcgi, можете вообще свой сишный демон без пхп заставить работать — nginx вам в помощь.
Ответ написан
romy4
@romy4
Exception handler
например, с помощью fastcgi.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы