Когда вы создаете собственное расширение 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;
    }
}

 Следующее.

Никаких мыслей по поводу “03 Ваше первое расширение.”