在阅读下面的内容之前,我们假定你已经对PHP 7 基本的数据结构都有大致的了解了,这是下面内容阅读的前提。
我们分为两大块:
首先实现一个自定义的文件打开、读取、写入、关闭的文件操作扩展;
然后分析各个操作背后的实现原理,其中某些部分的实现我会和PHP 5.3 使用资源包裹第三方扩展源码解读对比分析。
0 通过原型生成扩展骨架
首先进入到源码目录的ext目录中,添加一个文件操作的原型文件
编辑原型为
resourcefile_open(stringfilename,stringmode)
stringfile_read(resourcefilehandle,intsize)
boolfile_write(resourcefilehandle,stringbuffer)
boolfile_close(resourcefilehandle)
|
这样一个简单的文件操作扩展的代码骨架就生成了。
完整代码tipi_file.c,可以先有一个大致的了解,这样后面阅读时,思路可能会清晰很多。
1 扩展的实现
1.1注册资源类型
1.1.1 注册资源 API
ZEND_APIintzend_register_list_destructors_ex(rsrc_dtor_func_tld,rsrc_dtor_func_tpld,constchar*type_name,intmodule_number)
|
| 参数 |
解释 |
| ld |
释放该资源时调用的函数。 |
| pld |
释放用于在不同请求中始终存在的永久资源的函数。 |
| type_name |
是一个具有描述性类型名称的字符串。 |
| module_number |
为引擎内部使用,当我们调用这个函数时,我们只需要传递一个已经定义好的module_number变量。 |
该 API 返回一个资源类型 id,该id应当被作为全局变量保存在扩展里,以便在必要的时候传递给其他资源API。
1.1.2 添加资源释放回调函数
staticvoidtipi_file_dtor(zend_resource*rsrcTSRMLS_DC){
FILE*fp=(FILE*)rsrc-
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|
|