Вызов библиотеки C ++ из веб-приложения PHP: system () или расширение SWIG PHP? - PullRequest
5 голосов
/ 11 ноября 2010

У меня есть веб-приложение PHP, которое должно вызывать функцию в библиотеке C ++.Эта библиотека предоставлена ​​поставщиком (libfoo.a на машине с Linux).

  1. Мой первый инстинкт - создать исполняемый файл C ++, который ссылается на libfoo.a и передает параметры командной строки в функцию.Затем веб-приложение PHP может выполнить системный вызов моего исполняемого файла c ++.Это было бы легко осуществить.Меня беспокоит то, добавит ли это много накладных расходов для создания нового системного процесса для каждого вызова.Сколько это будет стоить?

  2. Альтернативой является то, что я мог бы использовать SWIG, чтобы обернуть функцию C ++ в расширение PHP, но у меня нет исходного кода C ++.Поддерживает ли SWIG связь с библиотекой ".a"?Потребуется ли каждому другому инженеру в моей команде изменить конфигурацию PHP, чтобы встроить в libfoo.a?

Если накладные расходы на вызов system () невелики (<30 мс), я бы предпочел вариант № 1, поскольку кажется, что гораздо проще создать исполняемый файл C ++ один раз, а невстроить его в приложение PHP.Каковы ваши рекомендации по двум вариантам?</p>

Ответы [ 4 ]

2 голосов
/ 17 апреля 2011

имейте в виду, что C ++ против C производит различное искажение имен функций, поэтому разные имена функций DLL с одинаковыми функциями, что означает разную связь.

"Сторонние поставщики расширений должны перестроить свои расширения, чтобы сделать их совместимымии загружается с помощью сборок Visual Studio C ++ 9, которые мы сейчас предоставляем. "

1 голос
/ 14 апреля 2011

Я бы предложил использовать протокол IPC (межпроцессное взаимодействие).Если вы все равно собираетесь написать приложение на C ++ с использованием библиотеки - напишите некоторый протокол связи (с использованием сокетов TCP / IP или unix) и запустите приложение как демон

см. man 3 daemon, man 2 fork и Руководство по сокетам Unix

PS сборка библиотеки в PHP не очень хорошая идея - C ++ не так уж и надежен, как PHP.в случае сбоя модуля библиотеки или php - происходит сбой всего веб-сервера или в лучшем случае происходит сбой одного сервера.Если вы разделяете его и происходит сбой программы / lib, вы можете показать сообщение о том, что что-то не так (или даже отправить уведомление по электронной почте), что не может произойти, если ваш веб-сервер не работает

0 голосов
/ 06 апреля 2011

Не уверен, что вы наконец сделали, но я сделал простое расширение php wrapper года назад, вызывая C ++ lib. Таким образом, у вас не будет служебных системных вызовов. Я не проблема для вас, но вы будете лучше контролировать вызовы библиотеки. Например, сохранение обертки в памяти в отличие от загрузки ее при каждом вызове, сохранение пользовательских параметров конфигурации и т. Д. Я зависит от характера вашей библиотеки.

Только некоторые ссылки, которые могут представлять интерес:

0 голосов
/ 06 апреля 2011

Я бы рекомендовал вариант 2. У меня нет опыта работы с PHP / SWIG, но я проделал то же самое для perl, java и PLSQL (oracle). Мы немного закодируем некоторые основные функции на языке C / C ++ (и будем использовать сторонние библиотеки), которые затем обернем в соответствующую оболочку.

Мы делаем это главным образом, чтобы у нас не было дублирования основных функций в трех языках приложения. Эффективность использования C является дополнительным преимуществом. И использование такой обертки (на мой взгляд) безопаснее, чем «оболочка» с системой, потому что вы можете передавать правильные параметры и возвращаемые значения как переменные, в отличие от грязного бизнеса анализа стандартного вывода.

Основные моменты, которые следует запомнить:

  • Вам потребуется использовать некоторую функцию, предоставляемую языком приложения (PHP для вас), чтобы выделить любую память для новых данных. например в Perl его NewSV.
  • Обычно для настройки PHP требуется определенный конфигурационный файл .so / .dll
...