Расширение для PHP с C++?
У меня есть интенсивная работа, написанная на PHP, которую я хотел бы перенести на C++ для повышения производительности. Есть ли способ написать плагин или расширение или что-то с помощью C++ и интерфейса с ним из PHP? Без ручного редактирования фактического источника PHP?
3 ответов
Я написал плагин PHP на C++ с помощью глоток. Это выполнимо, но может потребоваться некоторое время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с SWIG docs для PHP.
обновление
Как уже упоминалось @therefrohere, я настоятельно рекомендую вам получить книгу расширение и внедрение PHP. В интернете почти нет документации (по крайней мере, не было в конце 2008, начале 2009, когда я сделал мой PHP плагин). Мне приходилось во всем полагаться на книгу. Хотя иногда поиск кода Google полезен для поиска образца кода.
As Ремус говорит, вы можете расширить PHP с помощью C / C++ с помощью Zend API. Связанный учебник по Сара Golemon - хорошее начало, и книги расширение и внедрение 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 - и вот как указать 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 build system manual параметры:
- название расширения
- Список всех исходных файлов, которые являются частью расширения.
- (необязательный)
$ext_shared
, значение, которое было определено configure, когда PHP_ARG_WITH () был вызван для - (необязательно)" класс SAPI", только полезный для расширений, которые требуют CGI или CLI SAPIs специально. Его следует оставить пустым. все остальные случаи.
- (необязательно) список флагов, добавляемых в CFLAGS при создании расширения.
- (необязательно) логическое значение, которое, если "да", заставит все расширение быть построенным с использованием $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 команда, которая сделает этот хак ненужным.
PHP сам по себе представляет собой коллекцию слабо связанных библиотек. См.http://devzone.zend.com/article/1021 для учебника, как написать свой собственный.