簡體   English   中英

在Windows上使用正確的API版本編譯PHP擴展

[英]Compiling PHP Extension with correct API Version on Windows

經過無可估量的麻煩之后,我終於在Windows上創建了一個非常簡單的“ Hello World”風格的PHP擴展dll。 但是,盡管我已經成功創建了一個DLL,並將其放在extensions文件夾中,並告訴了php.ini,現在我得到了:

PHP警告:PHP啟動:\\ x81 \\ xc2 \\ xc0 \\ x03L&\\ xc0 \\ x03:無法初始化模塊\\ n使用模塊API = 16777522編譯的模塊\\ n使用模塊API = 20090626編譯的PHP \\ n這些選項需要匹配\\ n in Unknown on 0行
警告 :PHP啟動:“ L”:無法初始化模塊使用模塊API = 16777522編譯的模塊使用模塊API = 20090626編譯的PHP這些選項需要在第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擴展的所有源代碼-但是,我控制在DLL中終止的PHP_API_VERSION在哪里呢?

我正在使用Borland C ++ Builder v5.5(不是Visual Studio)成功編譯dll。

如果需要的話,這里是完整的資源:

// 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);
}

我該如何更改以消除API必須匹配的PHP啟動錯誤?

原來是“數據對齊”-我的DLL是使用“字”對齊進行編譯的,它需要是雙字的。

您應該將zend_modules.h中的API版本更改為PHP服務器在phpinfo()中指示的API版本。

例如,如果phpinfo()中的PHP擴展API為20090523,則應將zend_modules.h文件中的API編號更改為20090523,然后重新構建項目。

聽起來您正在針對與運行版本不同的PHP版本進行編譯。

窺視php.h並查找#define PHP_API_VERSION -這就是您要編譯的對象。

該版本與服務器上運行的版本是否相同?

檢查您的包含路徑,找到文件php.h並檢查那里的版本是否與您正在運行的php匹配(如果您檢查phpinfo()輸出,則會找到正在運行的版本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM