¿Extendiendo PHP con C++?
plugins php-extension (3)
PHP en sí una colección de bibliotecas poco relacionadas. Consulte http://devzone.zend.com/article/1021 para obtener un tutorial sobre cómo escribir el suyo.
Tengo una rutina de rendimiento intensivo que está escrita en PHP y me gustaría transferirla a C ++ para aumentar el rendimiento. ¿Hay alguna forma de escribir un complemento o extensión o algo usando C ++ e interactuar con él desde PHP? SIN editar manualmente la fuente real de PHP?
Escribí un plugin de PHP en C ++ con la ayuda de SWIG . Es factible, pero puede tomar un tiempo acostumbrarse al ciclo de compilación SWIG. Puede comenzar con los documentos SWIG para PHP .
Actualizar
Como @therefromhere ha mencionado, te recomiendo mucho que obtengas el libro Extendiendo e Incrustando PHP . Casi no hay documentación disponible en línea (al menos no fue a finales de 2008, principios de 2009 cuando hice mi plugin de PHP). Tenía que confiar en el libro para todo. Aunque a veces Google Code Search es útil para encontrar código de muestra.
Como dice Remus , puedes extender PHP con C / C ++ usando la API de Zend. El tutorial vinculado de Sara Golemon es un buen comienzo, y el libro Extendiendo e incrustando PHP del mismo autor cubre el tema con mucho más detalle.
Sin embargo, vale la pena señalar que ambos (y casi todo lo demás que encontré en línea) se centran en C y realmente no cubren algunos ajustes que necesita para que las extensiones de C ++ funcionen.
En el archivo config.m4
, necesita vincular explícitamente a la biblioteca estándar de C ++:
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
Cualquier comprobación de compilación de biblioteca C ++ en el archivo config.m4
también requerirá vincular la lib de C ++:
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
AC_MSG_ERROR([lib $LIBNAME not found.])
],[
-lstdc++ -ldl
])
EDITAR - y aquí está cómo especificar g ++:
Por último, y no menos importante, para elegir el compilador / enlazador de C ++ en lugar de C al construir la extensión, el sexto parámetro de PHP_NEW_EXTENSION()
debería ser "yes"
. es decir:
PHP_NEW_EXTENSION(your_extension,
your_extension.cpp,
$ext_shared,
,
"-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
"yes")
Del manual del sistema de compilación de PHP , los parámetros son:
- El nombre de la extensión
- Lista de todos los archivos fuente que son parte de la extensión.
- (opcional)
$ext_shared
, un valor que fue determinado por configure cuando PHP_ARG_WITH () fue llamado para - (opcional) "Clase SAPI", solo es útil para extensiones que requieren específicamente las SAPI de CGI o CLI. Debería dejarse vacío en todos los demás casos.
- (opcional) Una lista de banderas que se agregarán a CFLAGS al construir la extensión.
- (opcional) Un valor booleano que, si es "sí", forzará la construcción de toda la extensión usando $ CXX en lugar de $ CC.
No pude encontrar la forma de configurar el guión de configuración para establecer g ++ como el compilador / enlazador en lugar de gcc, así que terminé pirateando el Makefile con un comando sed para hacer un reemplazo de búsqueda en mi script bash build:
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
Presumiblemente hay un comando automake que haría innecesario este truco.