Компиляция расширения PHP с правильной версией API в Windows - PullRequest
1 голос
/ 07 ноября 2010

У меня наконец-то создал очень простое расширение PHP в стиле "Hello World" для Windows после неизмеримых хлопот.Однако, хотя я успешно создал DLL, поместил ее в папку расширений и рассказал об этом php.ini, теперь я получаю следующее:

Предупреждение PHP: Запуск PHP: \ x81 \ xc2 \ xc0 \x03L & \ xc0 \ x03: невозможно инициализировать модуль \ nМодуль, скомпилированный с модулем API = 16777522 \ nPHP, скомпилированный с модулем API = 20090626 \ nЭти параметры должны совпадать \ n в Неизвестно в строке 0 Предупреждение : запуск PHP: ÂÀL & À: невозможно инициализировать модуль Модуль, скомпилированный с модулем API = 16777522 PHP, скомпилированный с модулем API = 20090626 Эти параметры должны совпадать в Неизвестно в строке 0

Похоже, что мой PHP_API_VERSION - это 20090626, но по какой-то причине моя DLL считает, что это PHP_API_VERSION - 16777522.

Учебное пособие ниже было некоторой помощью при компиляции расширения dll: http://www.talkphp.com/vbarticles.php?do=article&articleid=49&title=creating-custom-php-extensions

Написав это сам, я имею доступ ко всему исходному коду для рассматриваемого расширения php - Но где же я контролирую PHP_API_VERSION, который заканчивается в DLL?

Я компилируюDLL успешно с Borland C ++ Builder v5.5, а не Visual Studio.

Вот полный исходный код на случай, если это имеет значение:

// Needed to make following two #includes compatible with borland header files
void __fastcall __assume(int t) {
  return;
}
typedef unsigned int socklen_t;
typedef enum BOOL
{
  false=0,
  true
} bool;
// end Borland compatibility code

#include "php.h"
#include "zend_config.w32.h"
ZEND_FUNCTION(fetch_LinkGrammar_links);

zend_function_entry LinkGrammar_ext_functions[] = {
    ZEND_FE(fetch_LinkGrammar_links, NULL)
    {NULL, NULL, NULL}
};

zend_module_entry LinkGrammar_ext_module_entry = {
    STANDARD_MODULE_HEADER,
    "LinkGrammar Extension",
    LinkGrammar_ext_functions,
    NULL, NULL, NULL, NULL, NULL,
    "1.0",
    STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(LinkGrammar_ext);

ZEND_FUNCTION(fetch_LinkGrammar_links)
{
    bool World = false;
    char *RetVal= "";
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &World) == FAILURE)
    {
        RETURN_STRING("Missing Parameter", true);
    }
    if (World == true)
    {
        RetVal= "Hello World";
    }
    else
    {
        RetVal= "Hello";
    }

    RETURN_STRING(RetVal, true);
}

Что можно изменить, чтобы исключить запуск PHPОшибка в том, что API должен совпадать?

Ответы [ 4 ]

1 голос
/ 11 ноября 2010

Оказывается, это было «выравнивание данных» - моя DLL компилировалась с использованием выравнивания «Word», и это должно было быть двойное слово.

0 голосов
/ 29 декабря 2012

Вам следует изменить версию API в zend_modules.h на версию API, которую ваш PHP-сервер указывает в phpinfo ().

Например, если API расширения PHP в phpinfo () - 20090523, вам нужно изменить номер API в файле zend_modules.h на 20090523, а затем пересобрать проект.

0 голосов
/ 07 ноября 2010

Проверьте ваши пути включения, найдите файл php.h и убедитесь, что версия там соответствует php, который вы используете (работающая версия найдена, если вы проверяете вывод phpinfo ()).

0 голосов
/ 07 ноября 2010

Звучит так, как будто вы компилируете против другой версии PHP, чем та, которую вы используете.

Загляните в php.h и найдите #define PHP_API_VERSION - это то, что вы компилируетепротив.

Это та же версия, которая работает на вашем сервере?

...