Расширение PHP с помощью C++?


У меня есть программа с высокой производительностью, написанная на PHP, которую я хотел бы перенести на C++ для повышения производительности. Есть ли способ написать плагин или расширение или что-то еще, используя C++ и интерфейс с ним из PHP? БЕЗ ручного редактирования фактического исходного кода PHP?

Author: John Carter, 2009-07-10

3 answers

Я написал PHP-плагин на C++ с помощью SWIG. Это выполнимо, но может потребоваться некоторое время, чтобы привыкнуть к циклу компиляции SWIG. Вы можете начать с документов SWIG для PHP.

Обновление
Как уже упоминал @therefromhere, я настоятельно рекомендую вам получить книгу , расширяющую и внедряющую PHP. В Интернете почти нет документации (по крайней мере, ее не было в конце 2008 - начале 2009 года, когда я делал свой PHP-плагин). Я должен был во всем полагайтесь на книгу. Хотя иногда поиск кода в Google полезен для поиска примеров кода.

 6
Author: StackedCrooked, 2010-07-17 00:16:24

Как говорит Ремус , вы можете расширить PHP с помощью C/C++, используя API Zend. Связанный учебник Сары Големон является хорошим началом, а книга , расширяющая и внедряющая 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 при создании расширения, 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 параметры являются:

  1. Имя расширения
  2. Список всех исходных файлов, которые являются частью расширения.
  3. (необязательно) $ext_shared, значение, которое было определено configure при вызове PHP_ARG_WITH() для
  4. (необязательно) "Класс SAPI", полезен только для расширений, для которых конкретно требуются CGI или CLI SAPI. Во всех остальных случаях его следует оставлять пустым.
  5. (необязательно) Список флагов, которые будут добавлены в CFLAGS при создании расширения.
  6. (необязательно) Логическое значение, которое, если "да", заставит все расширение быть построенным с использованием $CXX вместо $CC.

Я не мог понять, как заставить сценарий настройки установить 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, которая сделает этот взлом ненужным.

 19
Author: John Carter, 2017-05-23 12:00:17

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

 2
Author: Remus Rusanu, 2009-07-10 17:06:11