PHP 7.1扩展开发必须严格遵循Zend API规范:第一步声明ZEND_MODULE_STARTUP_N(myext)入口函数并返回SUCCESS;第二步在php_myext.h中定义版本并包含必要头文件;第三步在myext.c中用ZEND_FUNCTION宏定义函数、zend_parse_parameters解析参数(如"S"接收zend_string*)、ALLOC_INIT_ZVAL分配zval、array_init返回数组;第四步通过phpize→configure→make→make install编译,再于php.ini中精确配置extension=myext.so,最后用php -m和php --ri验证加载与导出。

你要在PHP 7.1环境下开发一个自定义扩展,但不知道从哪下手、哪些函数必须调用、结构怎么搭——这不是写普通PHP脚本,而是直接介入Zend引擎底层,每一步都得对上ZEND_API的签名和生命周期钩子。
初始化扩展模块结构
第一步是声明扩展入口,必须严格使用ZEND_MODULE_STARTUP_D宏定义的函数名格式,否则PHP加载时找不到启动逻辑,直接报“undefined symbol”错误。
创建php_myext.h头文件,在其中用#define PHP_MYEXT_VERSION "1.0.0"声明版本,并包含php.h和ext/standard/info.h。
在myext.c中写模块结构体:【ZEND_MODULE_STARTUP_N(myext)必须返回SUCCESS或FAILURE,不能留空或返回任意整数】;该函数会在扩展加载时立即执行,用于初始化内部资源(如哈希表、全局变量)。
注册函数与参数解析
方法一:用ZEND_FUNCTION宏定义导出函数
在myext.c中写ZEND_FUNCTION(myext_hello) { zend_string *name = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name) == FAILURE) { RETURN_FALSE; } php_printf("Hello %s", ZSTR_VAL(name)); RETURN_TRUE; }。
注意"S"表示接收zend_string*类型参数,不是char*;若传入非字符串会触发警告并返回FAILURE。
方法二:支持可选参数与默认值
改用"|S"语法,第二个参数变成指针,需手动判空:zend_string **greeting = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|S", &name, &greeting) == FAILURE) { RETURN_FALSE; };此时greeting可能为NULL,不可直接ZSTR_VAL()解引用。
内存管理与zval操作
第一步:分配新zval并赋值
用zval *retval; ALLOC_INIT_ZVAL(retval); ZVAL_STRING(retval, "done");——这一步必须用ALLOC_INIT_ZVAL而非emalloc,否则GC无法跟踪该zval生命周期。
第二步:安全读取用户传入zval
若函数接收zval *input,先检查类型:if (Z_TYPE_P(input) != IS_STRING) { php_error_docref(NULL, E_WARNING, "Expected string"); RETURN_FALSE; };不检查直接Z_STRVAL_P会导致段错误。
第三步:返回数组array_init(return_value); add_assoc_string(return_value, "status", "ok"); add_index_long(return_value, 0, 42);;return_value是预分配好的zval,直接往里填,不用RETVAL_*宏。
立即学习“PHP免费学习笔记(深入)”;
编译与加载验证
① 进入PHP源码ext/目录,复制skeleton模板到myext文件夹,替换所有skeleton为myext(包括config.m4里的名字)。
② 执行phpize && ./configure && make && sudo make install;make install后会输出扩展so路径,记下它。
③ 编辑php.ini,添加extension=myext.so;【必须确保so文件名与ini中extension=后的名称完全一致,大小写敏感,且无路径前缀】。
④ 运行php -m | grep myext,看到myext即表示加载成功;再执行php --ri myext查看模块信息和导出函数列表。



















