以下内容是本人学习过程中的笔记或者心得,如果有什么建议或者意见请在评论中提醒我,谢谢,这篇文章我会定期更新,由浅到深的分享我学PHP扩展历程
或者在学习中有什么问题欢迎交流
1.去PHP官网下载一个源码包,然后解压到某个目录
2.进入源码目录中的ext目录中
3.执行./ext_skel --extname=myext(这是扩展的名字) 生成扩展框架 [ps:如果ext_skel无法执行,请查看ext_skel文件是否有可执行权限]
4.编写扩展函数
a).我们打开myext.c文件,里面有一些函数,包括
PHP_FUNCTION(),这是编写扩展中函数逻辑的注册函数,每一个扩展函数对应一个PHP_FUNCTION(扩展函数名){}
下面四个函数是扩展的c文件中基本都有的,这些在PHP的整个生命周期中需要调用的,具体的请看:
PHP_MINIT_FUNCTION(),这个函数在该扩展被载入时调用
PHP_RINIT_FUNCTION(),PHP初始化执行脚本的基本环境,在文件请求到达后,文件编译前执行该函数,例如记录请求开始时间,结合请求结束时间,可以记录下处理请求所花费的时间
PHP_RSHUTDOWN_FUNCTION(),一般脚本执行结束(执行到末尾或者exit,die退出后)后调用该函数
PHP_MSHUTDOWN_FUNCTION(),SAPI生命周期结束后,一般注销一些持久化的资源
b).我们来编写一个自己的函数
在myext.c文件中添加
PHP_FUNCTION(myfunction){ long x,y,z; int argc =ZEND_NUM_ARGS(); if(zend_parse_parameters(argc TSRMLS_CC,"ll",&x,&y)==FAILURE) return; z = x * y; RETURN_LONG(z);}
然后在myext.c文件中的zend_function_entry myext_functions里面添加PHP_FE(myfunction,NULL) 注意后面不带逗号或者分号,需要换行
将config.m4中下面代码前的dnl去掉
dnl PHP_ARG_WITH(myext, for myext support,
dnl [ --with-myext Include myext support])在扩展目录下执行phpize命令生成扩展的配置工具
然后执行./configure -with-php-config=/usr/bin/php-config && make && make install 编译和安装,成功后在PHP扩展目录中可以看到编译好的myext.so文件
然后在php.ini文件中添加extension=myext.so
重启一下服务,测试myfunction(4,5)的结果是否输出20