[英]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.