PHP7系列使用资源包裹第三方扩展的

在阅读下面的内容之前,我们假定你已经对PHP7基本的数据结构都有大致的了解了,这是下面内容阅读的前提。

我们分为两大块:

首先实现一个自定义的文件打开、读取、写入、关闭的文件操作扩展;

然后分析各个操作背后的实现原理,其中某些部分的实现我会和PHP5.使用资源包裹第三方扩展源码解读对比分析。

0通过原型生成扩展骨架

首先进入到源码目录的xt目录中,添加一个文件操作的原型文件

[root

localhostphp-src-php-7.0.]#cdxt/

[root

localhostxt]#vimtipi_fil.proto

编辑原型为

rsourcfil_opn(stringfilnam,stringmod)

stringfil_rad(rsourcfilhandl,intsiz)

boolfil_writ(rsourcfilhandl,stringbuffr)

boolfil_clos(rsourcfilhandl)

[root

localhostxt]#./xt_skl--xtnam=tipi_fil--proto=./tipi_fil.proto

这样一个简单的文件操作扩展的代码骨架就生成了。

完整代码tipi_fil.c,可以先有一个大致的了解,这样后面阅读时,思路可能会清晰很多。

1扩展的实现1.1注册资源类型1.1.1注册资源API

ZEND_APIintznd_rgistr_list_dstructors_x(rsrc_dtor_func_tld,rsrc_dtor_func_tpld,constchar*typ_nam,intmodul_numbr)

参数解释ld释放该资源时调用的函数。pld释放用于在不同请求中始终存在的永久资源的函数。typ_nam是一个具有描述性类型名称的字符串。modul_numbr为引擎内部使用,当我们调用这个函数时,我们只需要传递一个已经定义好的modul_numbr变量。

该API返回一个资源类型id,该id应当被作为全局变量保存在扩展里,以便在必要的时候传递给其他资源API。

1.1.添加资源释放回调函数

staticvoidtipi_fil_dtor(znd_rsourc*rsrcTSRMLS_DC){

FILE*fp=(FILE*)rsrc-ptr;

fclos(fp);

}

我们发现该函数的参数类型是znd_rsourc。这是PHP7新增的数据结构,在PHP5则是znd_rsrc_list_ntry。细节的内容,我们留在后面分析。

1.1.在PHP_MINIT_FUNCTION中注册

我们知道在PHP生命周期中,当PHP被装载时,PHP_MINIT_FUNCTION(模块启动函数)即被引擎调用。这使得引擎做一些例如资源类型,注册INI变量等的一次初始化。

那么我们需要在这里通过znd_rgistr_list_dstructors_x在PHP_MINIT_FUNCTION来注册资源类型。

PHP_MINIT_FUNCTION(tipi_fil)

{

/*IfyouhavINIntris,un







































北京白癜风治疗好
白蚀症



转载请注明:http://www.jiaju1314.com/xxzl/10392.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了