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