记得第一次写php扩展是直接百度的。按照网上写的扩展,不知道为什么。先看一下扩展的基本步骤,再讨论原理。先使用源码工具自动生成扩展目录结构进入php源码的ext目录,执行以下命令/www/test/php/php/bin/phpext_skel.php--exthelloworldcdhelloworld修改config.m4配置文件,即现在写的扩展是否使用外部依赖,配置--with-hello选项,否则配置--enable-hello选项,根据自己的需要去掉注释dnl如果你的扩展引用了外部的东西,使用'with':PHP_ARG_WITH([helloworld],[forhelloworldsupport],[AS_HELP_STRING([--with-helloworld],[Includehelloworldsupport])])dnl否则使用'enable':写扩展函数然后写vimhelloworld.c中的扩展函数代码先看模块结构定义zend_module_entryhelloworld_module_entry={STANDARD_MODULE_HEADER,"helloworld",/*扩展名*/helloworld_functions,/*zend_function_entry*/PHP_MINIT(helloworld),/*PHP_MINIT-模块初始化*/NULL,/*PHP_MSHUTDOWN-模块关闭*/PHP_RINIT(helloworld),/*PHP_RINIT-Requestinitialization*/NULL,/*PHP_RSHUTDOWN-Requestshutdown*/PHP_MINFO(helloworld),/*PHP_MINFO-Moduleinfo*/PHP_HELLOWORLD_VERSION,/*Version*/PHP_MODULE_GLOBALS(pib)NULL,NULL,NULL,STANDARD_MODULE_PROPERTIES_EX};功能函数名字集合staticconstzend_function_entryhelloworld_functions[]={PHP_FE(helloworld_test1,arginfo_helloworld_test1)PHP_FE(helloworld_test2,arginfo_helloworld_test2)PHP_FE_END};真正的功能函数代码PHP_FUNCTION(helloworld_test2){intargc=ZEND_NUM_ARGS();char*messages=NULL;size_tmessages_len=0;char*context=NULL;size_tcontext_len=0;zend_string*retval;ZEND_PARSE_PARAMETERS_START(0,2)Z_PARAM_OPTIONALZ_PARAM_STRING(消息,messages_len)Z_PARAM_STRING(上下文,context_len)ZEND_PARSE_PARAMETERS_END();retval=strpprintf(0,"Hello%stest%s",messages,context);RETURN_STR(retval);}函数参数定义ZEND_BEGIN_ARGld_INFO(argin)ZEND_ARG_INFO(0,str)ZEND_END_ARG_INFO()编译安装/www/test/php/php/bin/phpize./configure--with-php-config=/www/test/php/php/bin/php-configmake&&makeinstall现在PHP的扩展目录下已经有一个helloworld.so文件,在php.ini中添加扩展配置extension=helloworld.so就可以测试了你写的函数helloworld_test2();完成一个扩展后,感觉自己一无所获,也不知道为什么要这样写的原理。下篇讲原理。先从php的生命周期说起,看下篇
