在PHP 8.4环境下开发自定义扩展,必须使用匹配版本的源码并严格遵循目录结构:下载php-8.4.x.tar.gz解压后ext目录须直接位于根下,执行./buildconf --force和./ext/ext_skel --extname=myext生成骨架,修正config.m4启用开关及myext.c中ZEND_MODULE_ENTRY末尾为STANDARD_MODULE_PROPERTIES,并安装php8.4-dev或确保php-config指向8.4版本。

在PHP 8.4环境下从零开发自定义扩展,必须严格匹配新版源码目录结构,否则phpize生成骨架失败、configure报错或编译后函数不可见。
确认PHP 8.4源码已正确解压并定位ext目录
进入PHP官方下载页(windows.php.net/downloads/releases/ 或 php.net/downloads),下载php-8.4.x.tar.gz(如php-8.4.5.tar.gz),解压后确保顶层目录包含ext/、main/、Zend/、TSRM/等文件夹;【ext目录必须是解压后直接可见的子目录,不能嵌套在php-src-8.4.5/php-src-8.4.5/ext中】。
执行ls -l | grep ext验证存在;若看到的是php-src-8.4.5/这样的双层嵌套,需cd进入内层再操作,否则后续phpize将找不到标准头文件路径。
使用ext_skel生成PHP 8.4兼容的扩展骨架
进入PHP源码根目录,运行:./buildconf --force(强制刷新autoconf缓存,避免旧版本残留导致ext_skel报错)。
立即学习“PHP免费学习笔记(深入)”;
执行:./ext/ext_skel --extname=myext(注意:不是./ext_skel,PHP 8.4起该脚本已移入ext/子目录)。
这一步会生成ext/myext/目录,含config.m4、php_myext.h、myext.c、CREDITS等文件;【若提示command not found,请先确认是否漏执行buildconf,或当前不在PHP源码根目录】。
检查并修正生成的扩展基础结构
第一步:进入ext/myext/目录,用ls查看关键文件是否存在——必须有config.m4、php_myext.h、myext.c、php_myext.h四个核心文件。
第二步:打开config.m4,找到dnl PHP_ARG_ENABLE(myext, whether to enable myext support,这一行,把整段dnl注释符删除(共三行),否则./configure时无法识别--enable-myext开关。
第三步:打开myext.c,确认第37行附近有ZEND_MODULE_ENTRY(myext)定义,且其参数列表末尾为STANDARD_MODULE_PROPERTIES——PHP 8.4已弃用ZEND_MODULE_BUILD_ID,若此处仍写成ZEND_MODULE_ENTRY(myext, "myext", myext_functions, PHP_MINIT(myext), PHP_MSHUTDOWN(myext), NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES)则编译会通过但模块加载时报“undefined symbol: zend_module_entry”。
配置PHP开发环境支持
方法一(Debian/Ubuntu):sudo apt install php8.4-dev。该包自动提供phpize、php-config及/usr/include/php/8.4下的全部头文件。
方法二(源码编译环境):确保PHP源码目录下已执行过./configure --enable-debug(或任意有效configure命令),否则make install未生成php-config可执行文件,后续步骤将中断。
验证:运行php-config --version输出应为8.4.x;若显示8.3或报command not found,说明系统默认php-config非PHP 8.4版本,必须用绝对路径调用,例如/path/to/php-8.4.5/php-config。



















