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;
}
}