Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 параметры:

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

Ответ 3

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