在阅读下面的内容之前,我们假定你已经对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注册资源APIZEND_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)
{