03 Ваше первое расширение.
Когда вы создаете собственное расширение PHP-CPP, вам также приходится его компилировать и развертывать. Обычный PHP-скрипт должен быть скопирован на веб-сервер для развертывания, но для развертывания расширения требуется немного больше усилий: вам нужен Makefile, файл php.ini для расширения, и, конечно же, файлы * .cpp в которые вы реализуете своим расширением.
Чтобы помочь вам выполнить эти шаги, мы создали почти пустое расширение со всеми этими необходимыми файлами. Он содержит образец Makefile, пример файла конфигурации и первый файл main.cpp, в котором уже запущен вызов get_module (). Это дает вам кикстарт при разработке расширения.
Makefile
Файл EmptyExtension содержит Makefile с инструкциями для компилятора. Вы должны будете внести некоторые (небольшие) изменения в этот Makefile, чтобы сделать его совместимым с вашим расширением. Наиболее важные вещи, которые вы хотите изменить, - это переменная NAME и, возможно, также INI_DIR.
# # Makefile шаблон # # Это пример Makefile, который может использоваться любым, # кто строит свои собственные расширения PHP, используя библиотеку PHP-CPP. # # В верхней части этого файла мы включаем переменные, которые могут быть изменены # в соответствии с вашей конфигурацией, в нижней части указаны инструкции # и зависимости для компилятора. Чем глубже вы попадете в этот файл, # тем меньше вероятность того, что вам придется что-то изменить. # # # Имя вашего расширения # # Это имя вашего расширения. На основе этого имени расширения автоматически создается # имя файла библиотеки (name.so) и # имя файла конфигурации (name.ini) # NAME = yourextension # # Php.ini каталоги # # Раньше PHP использовал один конфигурационный файл php.ini. Сегодня большинство установок # PHP используют каталог conf.d, содержащий набор конфигурационных файлов, # по одному для каждого расширения. Используйте эту переменную, чтобы указать этот каталог. # # В Ubuntu 14.04 используется Apache 2.4, который использует каталог mods-available # вместо каталога conf.d. В 16.04 каталог снова изменился. # Это нужно проверить. # UBUNTU_MAJOR := $(shell /usr/bin/lsb_release -r -s | cut -f1 -d.) OVER_SIXTEEN := $(shell echo "${UBUNTU_MAJOR} >= 16" | bc) OVER_FOURTEEN := $(shell echo "${UBUNTU_MAJOR} >= 14" | bc) ifeq (${OVER_SIXTEEN}, 1) INI_DIR = /etc/php/7.0/mods-available/ else ifeq (${OVER_FOURTEEN}, 1) INI_DIR = /etc/php5/mods-available/ else INI_DIR = /etc/php5/conf.d/ endif # # Каталоги расширений # # Обычно это каталог, такой как /usr/lib/php5/20121221 (на основе # используемой вами версии PHP. Мы используем инструкцию командной строки 'php-config' # для того, чтобы узнать, что такое каталог расширений, # вы можете переопределить это с помощью другого фиксированного каталога # EXTENSION_DIR = $(shell php-config --extension-dir) # # Имя модуля и имя .ini-файла # # Эти две переменные основаны на имени расширения. Мы просто добавляем к ним # определенное расширение (.so или .ini) # EXTENSION = ${NAME}.so INI = ${NAME}.ini # # Компилятор # # По умолчанию используется компилятор GNU C ++. Если вы хотите использовать другой # компилятор, вы можете изменить это здесь. Вы можете изменить это как для # компилятора (программы, которая превращает файлы c ++ в объектные файлы), так и для # компоновщика (программа, которая связывает все объектные файлы в один файл # библиотеки .so. По умолчанию g ++ (компилятор GNU C ++) используется для обоих. # COMPILER = g++ LINKER = g++ # # Флаги компилятора и компоновщика # # Эта переменная содержит флаги, которые передаются компилятору. По умолчанию # мы включаем флаг -O2. Этот флаг сообщает компилятору оптимизировать код, # но это затрудняет отладку. Поэтому, если вы отлаживаете свое приложение, # вы, вероятно, захотите удалить этот флаг -O2. В то же время # вы можете добавить флаг -g, чтобы проинструктировать компилятор включить информацию # об отладке в библиотеке (но это сделает окончательный libphpcpp.so файл намного больше, # поэтому вы хотите оставить этот флаг на рабочих серверах). # # Если ваше расширение зависит от других библиотек (и оно, по крайней мере, # зависит от одного: библиотека PHP-CPP), вы должны обновить переменную LINKER_DEPENDENCIES # со списком всех флагов, которые должны быть переданы компоновщику. # COMPILER_FLAGS = -Wall -c -O2 -std=c++11 -fpic -o LINKER_FLAGS = -shared LINKER_DEPENDENCIES = -lphpcpp # # Команда для удаления файлов, копирования файлов и создания каталогов. # # Я никогда не сталкивался с средой * nix, в которой эти команды не работают. # Таким образом, вы, вероятно, можете оставить это как есть # RM = rm -f CP = cp -f MKDIR = mkdir -p # # Все исходные файлы - это все * .cpp-файлы, найденные в текущем каталоге # # Встроенный макрос Makefile используется для сканирования текущего каталога и поиска # всех исходных файлов. Объектные файлы - это все скомпилированные # версии исходного файла, при этом расширение .cpp заменяется на .o. # SOURCES = $(wildcard *.cpp) OBJECTS = $(SOURCES:%.cpp=%.o) # # Отсюда начинаются инструкции по сборке # all: ${OBJECTS} ${EXTENSION} ${EXTENSION}: ${OBJECTS} ${LINKER} ${LINKER_FLAGS} -o $@ ${OBJECTS} ${LINKER_DEPENDENCIES} ${OBJECTS}: ${COMPILER} ${COMPILER_FLAGS} $@ ${@:%.o=%.cpp} install: ${CP} ${EXTENSION} ${EXTENSION_DIR} ${CP} ${INI} ${INI_DIR} clean: ${RM} ${EXTENSION} ${OBJECTS}
Yourextension.ini
У вашего расширения должен быть не только Makefile, но и исходный файл yourextension.ini. Этот файл намного проще, чем Makefile. Вы также должны изменить этот файл, чтобы ссылаться на настоящее имя вашего расширения (вместо yourextension.so).
extension=yourextension.so
Main.cpp
Последним файлом, доступным в этом файле EmptyExtension, является фактическая реализация расширения. Поскольку расширение пусто (duh!), Содержимое этого main.cpp нуждается в большой модификации: вам придется добавить к нему все свои функции и классы.
#include <phpcpp.h> /** * сообщите компилятору, что get_module - это чистая функция C */ extern "C" { /** * Функция, которая вызывается PHP сразу после начала процесса PHP, * и возвращает адрес внутренней структуры PHP со всеми * подробностями и функциями вашего расширения * * @return void* указатель на адрес, который понимается PHP */ PHPCPP_EXPORT void *get_module() { // static(!) Php::Extension объект, который должен оставаться в памяти // на протяжении всего процесса (поэтому он статичен) static Php::Extension extension("yourextension", "1.0"); // @todo добавляет свои собственные функции, классы, пространства имен в расширение // вернуть расширение return extension; } }