У меня есть интенсивная процедура, написанная на PHP, которую я хотел бы переносить на C ++ для повышения производительности. Есть ли способ написать плагин или расширение или что-то с помощью C ++ и связать его с PHP? БЕЗ ручной редактирования исходного PHP-источника?
Я написал PHP-плагин на C ++ с помощью SWIG . Это выполнимо, но может потребоваться некоторое время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с документов SWIG для PHP .
Обновить
Как уже упоминалось в @therefromhere, я очень рекомендую вам получить книгу « Расширение и внедрение PHP» . Почти нет документации, которую можно найти в Интернете (по крайней мере, в конце 2008 года, начале 2009 года, когда я сделал свой PHP-плагин). Я должен был полагаться на книгу на все. Хотя иногда поиск кода Google полезен для поиска кода примера.
Как говорит Ремус , вы можете расширить PHP с помощью C / C ++ с помощью Zend API. Связанный учебник Sara 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 ])
И последнее, и не в последнюю очередь, для выбора 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 () Я не мог понять, как заставить скрипт 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 для учебника, как написать свой собственный.