Попытка написать расширение для PHP (PHP extension)

16.01.2012

Для компиляции расширения использовал утилиту phpize.
Если у Вас при вводе
# phpize

Выдается:
-bash: phpize: command not found

или:
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.


Это значит, что утилита не установлена.

phpize идет вместе с комплектом php-devel, который и нужно установить, чтобы данная утилита стала для Вас доступной.


Debian (или ubuntu):

$ sudo aptitude install php5-dev

CentOS (или RedHat):
$ sudo yum install php-devel
или для PHP 5.3.x
$ sudo yum install php53-devel



Далее нужно создать директорию с тремя файлами.

  1. Конфигурационный файл (config.m4) - этот файл используемый утилитой phpize для подготовки расширения к компиляции:
    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, hello.c, $ext_shared)
    fi

  2. Заголовочный файл (php_hello.h), содержащий указания, используемые PHP для загрузки расширений:
    #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. файл с исходниками (hello.c), содержащий тело функции hello_world:
    #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);
    }


Теперь нужно скомпилировать расширение:

1
2
3
$ phpize
$ ./configure --enable-hello
$ make

Далее нужно поместить файл расширения в предназначенную для этого директорию.
Если Вы не знаете расположение этой папки (или папок), то можно запустить phpinfo() и посмотреть значение директивы extension_dir

Пример использования расширения из php скрипта:

dl('hello.so');
echo hello_world().'<br>';


Категории: PHP
Яндекс.Метрика