c — произвольное расширение PHP

Мне нужно создать собственное расширение для PHP. Все идет хорошо, пока я не хочу загрузить скомпилированное расширение в PHP. Чем я получаю это сообщение об ошибке (используя php -m): «Предупреждение: запуск PHP: недопустимая библиотека (может быть, не библиотека PHP) ‘first.so’ в поле« Неизвестно »в строке 0»

ОПЕРАЦИОННЫЕ СИСТЕМЫ:

OS X 10.8.5

Вот мой процесс компиляции, в котором нет ошибки вообще:

$ phpize54
$ sudo ./configure --with-php-config=/opt/local/bin/php-config54
$ sudo make install

Я регистрирую расширение по .ini файлу в dir для дополнительных файлов .ini

extension=first.so

Я не использую никаких дополнительных инструментов. Когда я пытался компилировать какое-то расширение прямо из расширений, включенных в исходные тексты дистрибутива PHP (точнее, posix), все работает, и расширение загружалось правильно.

Кто-нибудь видит ошибку в моем исходном коде ниже? Спасибо тебе за помощь.

config.m4:

PHP_ARG_ENABLE(first,whether to enable FIRST functions,
[  --disable-first         Disable FIRST functions], yes)

if test "$PHP_FIRST" = "yes"; then
AC_DEFINE(HAVE_FIRST, 1, [whether to include FIRST functions])
PHP_NEW_EXTENSION(first, first.c, $ext_shared)
fi

first.c

#ifdef HAVE_CONFIG_H
#include "config.h"#endif

#include "php.h"#include "ext/standard/info.h"
extern zend_module_entry first_module_entry;
#define first_module_ptr &first_module_entry
#define phpext_first_ptr first_module_ptrstatic PHP_MINFO_FUNCTION(first)
{
php_info_print_table_start();
php_info_print_table_row(2, "Revision", "$Id: 01 $");
php_info_print_table_end();
}

static PHP_MINIT_FUNCTION(first)
{
return SUCCESS;
}

PHP_FUNCTION(hallo)
{
RETURN_STRING("FIRST extension function works\n", 1);
}

ZEND_BEGIN_ARG_INFO_EX(arginfo_hallo, 0, 0, 0)
ZEND_END_ARG_INFO()

const zend_function_entry first_functions[] =
{
PHP_FE(hallo, arginfo_hallo)
PHP_FE_END
};

zend_module_entry first_module_entry = {
STANDARD_MODULE_HEADER,
"first",
first_functions,
PHP_MINIT(first),
NULL,
NULL,
NULL,
PHP_MINFO(first),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_POSIX
ZEND_GET_MODULE(first)
#endif

0

Решение

#ifdef COMPILE_DL_POSIX
ZEND_GET_MODULE(first)
#endif

Это выглядит неправильно. В config.m4 вы утверждаете, что ваше расширение вызывается первым (PHP_NEW_EXTENSION(first, ...) но там вы проверяете, является ли расширение под названием posix встроенным.

Справочная информация: PHP может загружать расширения (имеется в виду модули PHP не путать с Zend Extensions, такими как xdebug или opcache, — это разные топики) двумя способами. Либо статически скомпилировано в PHP, либо совместно используется.

Статически означает, что ваше расширение построено как часть PHP и встроено прямо в двоичный файл php. (поместите его в php-src / ext /, запустите buildconf, настройте). Это работает, настраивая создание файла main/internal_functions.c который включает в себя все php_foo.h файлы и создание массива module_entry который обрабатывается при запуске PHP.

Если расширение является сборкой общего доступа (используя --with-foo=shared в php-src или phpize) и загрузка его через php.ini PHP будет искать функцию get_module() с помощью dlopen() а также dlsym() системный интерфейс (или LoadDll на Windows), который вернет структуру модуля. Чтобы не иметь, чтобы написать эту функцию get_module() все время макрос ZEND_GET_MODULE делает это Но get_module это общее имя, и во время статической сборки нужно предотвратить, чтобы каждое расширение создавало его, так как это привело бы к конфликту, имеющему одну и ту же функцию несколько раз в одном и том же двоичном файле, поэтому система сборки создает COMPILED_DL_FOO, который определяет, что можно использовать в качестве охранников.

Так что в вашем случае PHP открывает библиотеку, ищет get_module() но не может найти его, пожимает плечами и сообщает об ошибке.

Рекомендации:

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector