Расширение для 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 параметры:

  1. название расширения
  2. Список всех исходных файлов, которые являются частью расширения.
  3. (необязательный) $ext_shared, значение, которое было определено configure, когда PHP_ARG_WITH () был вызван для
  4. (необязательно)" класс SAPI", только полезный для расширений, которые требуют CGI или CLI SAPIs специально. Его следует оставить пустым. все остальные случаи.
  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 команда, которая сделает этот хак ненужным.


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