Расширение PHP с помощью C++?
У меня есть программа с высокой производительностью, написанная на PHP, которую я хотел бы перенести на C++ для повышения производительности. Есть ли способ написать плагин или расширение или что-то еще, используя C++ и интерфейс с ним из PHP? БЕЗ ручного редактирования фактического исходного кода PHP?
3 answers
Я написал PHP-плагин на C++ с помощью SWIG. Это выполнимо, но может потребоваться некоторое время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с документов SWIG для PHP.
Обновление
Как уже упоминал @therefromhere, я настоятельно рекомендую вам получить книгу , расширяющую и внедряющую PHP. В Интернете почти нет документации (по крайней мере, ее не было в конце 2008 - начале 2009 года, когда я делал свой PHP-плагин). Я должен был во всем полагайтесь на книгу. Хотя иногда поиск кода в Google полезен для поиска примеров кода.
Как говорит Ремус , вы можете расширить PHP с помощью C/C++, используя API Zend. Связанный учебник Сары Големон является хорошим началом, а книга , расширяющая и внедряющая PHP того же автора, охватывает эту тему гораздо более подробно.
Однако стоит отметить, что оба эти (и почти все остальное, что я нашел в Интернете) сосредоточены на C и на самом деле не охватывают некоторые настройки, необходимые для работы расширений C++.
В файле config.m4
вы необходимо явно ссылаться на стандартную библиотеку C++:
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
Любая проверка компиляции библиотеки C++ в файле config.m4
также потребует связывания библиотеки C++:
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
AC_MSG_ERROR([lib $LIBNAME not found.])
],[
-lstdc++ -ldl
])
РЕДАКТИРОВАТЬ - и вот как указать g++:
И последнее, и не менее важное, для того, чтобы выбрать C++, а не компилятор/компоновщик C при создании расширения, 6-й параметр 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 параметры являются:
- Имя расширения
- Список всех исходных файлов, которые являются частью расширения.
- (необязательно)
$ext_shared
, значение, которое было определено configure при вызове PHP_ARG_WITH() для - (необязательно) "Класс SAPI", полезен только для расширений, для которых конкретно требуются CGI или CLI SAPI. Во всех остальных случаях его следует оставлять пустым.
- (необязательно) Список флагов, которые будут добавлены в CFLAGS при создании расширения.
- (необязательно) Логическое значение, которое, если "да", заставит все расширение быть построенным с использованием $CXX вместо $CC.
Я не мог понять, как заставить сценарий настройки установить 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, которая сделает этот взлом ненужным.
PHP сам по себе представляет собой набор слабо связанных библиотек. См. http://devzone.zend.com/article/1021 для руководства по написанию собственного.