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

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

 John Carter23 февр. 2011 г., 22:23
Стоит отметить, что здесь очень похожий вопрос:stackoverflow.com/questions/492014/…

Ответы на вопрос(3)

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

Решение Вопроса

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

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

Ремус говоритВы можете расширить 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
])
EDIT - and here's how to specify 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Параметры:

The name of the extension List of all source files which are part of the extension. (optional) $ext_shared, a value which was determined by configure when PHP_ARG_WITH() was called for (optional) "SAPI class", only useful for extensions which require the CGI or CLI SAPIs specifically. It should be left empty in all other cases. (optional) A list of flags to be added to CFLAGS while building the extension. (optional) A boolean value which, if "yes", will force the entire extension to be built using $CXX instead of $CC.

I couldn't work out how to get the configure script to set g++ as the compiler/linker instead of gcc, so ended up hacking the Makefile with a sed command to do a search replace in my bash build script:

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

Presumably there's an Automake команда, которая сделает этот хак ненужным.

 27 дек. 2009 г., 18:08
+1 за такой полный ответ :)
 11 янв. 2012 г., 22:54
Это может стать проблемой, если вы однажды переключитесь на другую платформу или компилятор. Кланг становится популярным в эти дни, например. И я главным образом добавил это для будущих разработчиков, попадающих на эту страницу :-)
 27 дек. 2011 г., 11:58
Установка флагов компилятора Mind Tat таким способом является плохой практикой. Это делает невозможным использование разных компиляторов. Либо сделайте его зависимым от компилятора, либо предоставьте его пользователю. Опция может быть использована для общих опций, таких как -D. Кроме того, вполне вероятно, что -Wall и -Werror создадут проблемы - PHP написан на C и C ++, в некоторых случаях он немного строже, поэтому вы можете потерпеть неудачу в заголовках PHP. Мы исправили многие из этих проблем в 5.4, но некоторые предупреждения C ++ все еще могут появляться.
 11 янв. 2012 г., 20:38
@ Johannes достаточно справедливо, этот проект был предназначен только для внутреннего использования, так что для меня это не было проблемой.

Ваш ответ на вопрос