Расширение PHP с C ++? - PullRequest
       14

Расширение PHP с C ++?

13 голосов
/ 10 июля 2009

У меня есть высокопроизводительная подпрограмма, написанная на PHP, которую я хотел бы перенести на C ++ для повышения производительности. Есть ли способ написать плагин или расширение или что-то с использованием C ++ и интерфейс с ним из PHP? БЕЗ ручного редактирования фактического исходного кода PHP?

Ответы [ 3 ]

20 голосов
/ 27 декабря 2009

Как говорит Ремус , вы можете расширить PHP с помощью C / C ++, используя Zend API. Связанное руководство Сара Големона является хорошим началом, и книга Расширение и внедрение PHP того же автора освещает эту тему гораздо более подробно.

Тем не менее, стоит отметить, что оба из них (и в значительной степени все остальное, что я нашел в Интернете) фокусируются на C и не затрагивают некоторые хитрости, необходимые для работы расширений C ++.

В файле config.m4 вам необходимо явно указать стандартную библиотеку C ++:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)

Любая проверка компиляции библиотеки C ++ в файле config.m4 также потребует ссылки на C ++ lib:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])

РЕДАКТИРОВАТЬ - и вот как указать g ++:

И последнее, и не в последнюю очередь, чтобы при компиляции расширения выбирать компилятор / компоновщик C ++, а не компилятор C, параметр 6th для PHP_NEW_EXTENSION() должен быть "yes". то есть:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")

Из руководства по системе сборки PHP параметры:

  1. Название расширения
  2. Список всех исходных файлов, являющихся частью расширения.
  3. (необязательно) $ext_shared, значение, которое было определено при настройке при вызове PHP_ARG_WITH () для
  4. (необязательно) «Класс SAPI», используется только для расширений, для которых конкретно требуются SAPI CGI или CLI. Во всех остальных случаях его следует оставить пустым.
  5. (необязательно) Список флагов, добавляемых в CFLAGS при создании расширения.
  6. (необязательно) Булево значение, которое, если "да", заставит все расширение быть построенным с использованием $ CXX вместо $ CC.

Я не мог понять, как заставить скрипт configure установить g ++ в качестве компилятора / компоновщика вместо gcc, поэтому в итоге я взломал Makefile с помощью команды sed, чтобы выполнить замену поиска в моем скрипте сборки bash:

phpize
./configure --with-myextension
if [ "$?" == 0 ]; then
# Ugly hack to force use of g++ instead of gcc
# (otherwise we'll get linking errors at runtime)
   sed -i 's/gcc/g++/g' Makefile
   make clean
   make
fi

Предположительно есть команда automake , которая сделает этот хак ненужным.

6 голосов
/ 11 июля 2009

Я написал плагин PHP на C ++ с помощью SWIG . Это выполнимо, но может потребоваться некоторое время, чтобы привыкнуть к циклу SWIG-компиляции. Вы можете начать с SWIG документации для PHP .

Обновление
Как уже упоминалось @therefromhere, я настоятельно рекомендую вам получить книгу Расширение и внедрение PHP В сети почти нет документации (по крайней мере, в конце 2008 года, в начале 2009 года, когда я сделал свой плагин PHP). Я должен был положиться на книгу во всем. Хотя иногда поиск кода Google полезен для поиска примера кода.

2 голосов
/ 10 июля 2009

PHP сам по себе коллекция свободно связанных библиотек. См. http://devzone.zend.com/article/1021 для учебника, как написать свой собственный.

...