Пишем простое расширение PHP на C

Из этой публикации вы узнаете как создаются расширения PHP и найдете полные исходники простого примера реализации функции на языке C. По традиции создаваемая функция будет уметь делать одну-единственную вещь:

function hello_world() {
    return 'Hello World!';
}

то есть возвращать строку ‘Hello World!’ :) Все примеры были проверены на Debian Lenny с установленным пакетом php-5.2.6-1+lenny2 и должны без изменений работать на любом современном дистрибутиве Линукса.

В дальнейшем я буду предполагать что у вас имеется компьютер с установленной ОС Линукс (или хотя бы ssh-доступ к таковой), базовые знания языка C и небольшое знакомство с командной строкой Линукса. Поэтому я пропущу многие банальные подробности и буду писать только по сути вопроса…

Создаем файлы исходников для нашего расширения PHP

Для начала создадим пустую папку php_hello и в ней создадим три файла с таким содержимым:

  1. config.m4

    PHP_ARG_ENABLE(hello, whether to enable Hello World support, [ --enable-hello   Enable Hello World support])
     
    if test "$PHP_HELLO" = "yes"; then
      AC_DEFINE(HAVE_HELLO, 1, [Whether you have Hello World])
      PHP_NEW_EXTENSION(hello, php_hello.c, $ext_shared)
    fi
  2. php_hello.h

    #ifndef PHP_HELLO_H
    #define PHP_HELLO_H 1
     
    #define PHP_HELLO_WORLD_VERSION "1.0"
    #define PHP_HELLO_WORLD_EXTNAME "hello"
     
    PHP_FUNCTION(hello_world);
     
    extern zend_module_entry hello_module_entry;
    #define phpext_hello_ptr &hello_module_entry
     
    #endif
  3. php_hello.c

    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
     
    #include <php.h>
    #include "php_hello.h"
     
    static function_entry hello_functions[] = {
        PHP_FE(hello_world, NULL)
        {NULL, NULL, NULL}
    };
     
    zend_module_entry hello_module_entry = {
    #if ZEND_MODULE_API_NO >= 20010901
        STANDARD_MODULE_HEADER,
    #endif
        PHP_HELLO_WORLD_EXTNAME,
        hello_functions,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
    #if ZEND_MODULE_API_NO >= 20010901
        PHP_HELLO_WORLD_VERSION,
    #endif
        STANDARD_MODULE_PROPERTIES
    };
     
    #ifdef COMPILE_DL_HELLO
    ZEND_GET_MODULE(hello)
    #endif
     
    PHP_FUNCTION(hello_world)
    {
        RETURN_STRING("Hello World", 1);
    }

Или можно просто распаковать архив с исходниками расширения PHP. Он уже содержит все необходимые файлы в готовом к компиляции виде.

Компилируем расширение PHP

После того как были созданы все необходимые файлы переходим к следующему важному этапу - сборке расширения PHP. Перед тем как начинать компиляцию убедитесь что в вашей системе установлен пакет php5-dev (для Debian или Ubuntu). Для остальных дистрибутивов: проверьте что у вас есть файлы php.h (который подключался в файле исходинков выше) и команда phpize5 (которая выполнит за нас большую часть рутинной работы по созданию всех необходимых исходников).

Теперь переключаемся в командную строку, переходим в каталог с исходниками и набираем такие команды:

$ phpize
$ ./configure --enable-hello
$ make

В результате выполнения этих команд будет подготовлено дерево исходников, запущена компиляция и, в случае успешного ее окончания, в директории modules/ вы найдете файл - hello.so Это и есть наше расширение PHP

Устанавливаем свежеоткомпилированное расширение PHP

Устанавливаем полученное расширение PHP как обычно: просто копируем файл hello.so в директорию к остальным файлам расширения PHP. Для Дебиан Ленни этой директорией будет /usr/lib/php5/20060613+lfs, для других дистрибутивов путь скорее всего будет отличаться… И добавляем строчку extension=hello.so в файл конфигурации PHP. Теперь расширение готово к тестированию.

Проверяем работоспособность расширения PHP

Для проверки переходим в командную строку и запускаем команду: php -r ‘echo hello_world();’. Если все прошло успешно, то вы увидите на экране вывод функции - строку ‘Hello World’. Теперь вас можно поздравить с первым работающим расширением языка PHP, который вы откомпилировали и установили собственными руками! :)

В качестве дополнительного источника информации на английском языке советую сайт devzone.zend.com, на котором каждый кто серьезно интересуется программированием на PHP обязательно найдет для себя много полезного материала.

Если вам понравился этот сайт, вы можете подписаться на rss

Отзывы: Комментариев нет

Ваш отзыв

Имя (*)

E-mail (*)

Сайт

Сообщение

Архивы

службы мониторинга серверов