PHP内核介绍及扩展开发指南.pdf

5星(超过95%的资源)
所需积分/C币:9 2012-09-29 17:17:22 441KB PDF
1
收藏 收藏
举报

1 、 基础知识 ............................................................................................................................... 4 1.1.1 PHP 变量的存
3,23获取资源灬 38 324维护引用计数 4、类和对象(TODO2…1 ,··········,·· 40 附录A. Extension的编译. 附录B. xtension的加载过程 1、基础知识 本章简要介绍一些Zend引擎的内部机制,这些知识和 Extensions密切相关,同时也可以帮助我们写出更加高效的PHP代 11.1PHP变量的存储 1.1.1zva结构 zend使用zwal结构来存储PHP变量的值,该结构如下所示: typedef union zvalue value t ⊥ ong Iva1; /x⊥ ong value*/ double dval /x double value * struct t int len 1 stri Hashtable ht /x hash table value end obiec- value obii s zvalue value; truct zval struct f / Varial formation * zvaluc valuc valuci /*a_ue*/ z∈ nd uint refcour zcnd uchar vpci /x active type x/ zend uchar is ref typedef struct zva⊥ struct zva⊥ zend根据type值来决定访问 value的哪个成员,可用值如下 IS NULL N/A IS LONG 对应va1ue.1va1 IS DOUBLE 对应va1ue.dva1 IS STRING 对应va1ue.str IS ARRAY 对应va1ueht IS OBJECT 对应va1ue.ob IS BOOL 对应 value.1va1. IS RESOURC 对应va1ue.1va1 根据这个表格可以发现两个有意思的地方:首先是PHP的数组 其实就是一个 Hashtable,这就解释了为什么PHP能够支持关联数 组了;其次, Resource就是一个long值,它里面存放的通常是个指 针、一个内部数组的 index或者其它什么只有创建者自己才知道的东 西,可以将其视作一个 handle o 1.12引用计数 引用计数在垃圾收集、内存池以及字符串等地方应用广泛 Zend就实现了典型的引用计数。多个PHP变量可以通过引用计数机 制来共享同一份zval,zval中剩余的两个成员 is ref和 refcount就用 来支持这种共享。 很明显, refcount用于计数,当增减引用时,这个值也相应的 递增和递减,一旦减到零,Zend就会回收该zval 那么 is ref呢? 1.13zva状态 在PHP中,变量有两种一一引用和非引用的,它们在zend中 都是采用引用计数的方式存储的。对于非引用型变量,要求变量间 互不相干,修改一个变量时:不能影响到其他变量,采用 Copy-On writ机制即可解决这种冲突—一当试图写入一个变量时,Zend若 发现该变量指向的zval被多个变量共享,则为其复制一份 refcount 为1的zval,并递减原zval的 refcount,这个过程称为“zval分离” 然而,对于引用型变量,其要求和非引用型相反,引用赋值的变量 间必须是捆绑的,修改一个变量就修改了所有捆绑变量 可见,有必要指出当前zval的状态,以分别应对这两种情况 is ref就是这个目的,它指出了当前所有指向该zva的变量是否是 采用引用赋值的一—要么全是引用,要么全不是。此时再修改一个 变量,只有当发现其zval的 is ref为0,即非引用时,Zend才会执 行 Copy-On- Write 1.1.4zva状态切换 当在一个wva上进行的所有赋值操作都是引用或者都是非引用 时,一个 is ref就足够应付」然而,世界总不会那么美好,PHP无 法对用户进行这种限制,当我们混合使用引用和非引用赋值时,就 必须要进行特别处理了 情况I丶看如下PHP代码: ?phi sai Sc= Sbi sd=sc;//在一堆非引用赋值中,插入一个引用 这段代码首先进行了一次初始化,这将创建一个新的 zval, is ref-0, refcount-1,并将a指向这个zval;之后是两次非引 用赋值,正如前面所说,只要把b和c都指向a的zval即可:最后 行是个引用赋值,需要 is ref为 是end发现c指向的zal 并不是引用型的,于是为c创建单独的zval,并同时将d指向该 zva 从本质上来说,这也可以看作是一种 Copy-On-Write,不仅仅 是 value, is ref也是受保护的对象。 整个过程图示如下: is ref=0 refcount=2 b f=0 refcount =3 ef= 1 原z refcount=2 新zval 引用赋值前 引用赋值后 情况Ⅱ,看如下PHP代码 < php Sa=1 5=&sa b sd=sc;//在一堆引用赋值中,插入一个非引用 这段代码的前三句将把a、b和c指向一个zval,其 is ref=1, refcount-3:第四句是个非引用赋值,通常情况下只需要增加引用 计数即可,然而目标zval属于引用变量,单纯的增加引用计数显然 是错误的,Zend的解决办法是为d单独生成一份zva副本。 全过程如下所示: f=1 refcount =3 is rcf= 1 refcount=3 原zval is ref=0 原zval refcount=1 非引用赋值前 非弓用赋值后 1.1.5参数传递 PHP函数参数的传递和变量赋值是一样的,非引用传递相当 非引用赋值,引用传递相当于引用赋值,并且也有可能会寻致执行 zval状态切换。这在后面还将提到 12 HashTable结构 Hashtable是Zend引擎中最重要使用最广泛的数据结构,它被 用来存储几乎所有的东西 121数据结构 HashTable数据结构定义如下 typedef struct bucket t ⊥ong //存放ha uint nReyLength void *dAtai //指向va1ue,是用户数据的副本 void *pDacaPtri struct bucket *ol.istNext // pTistNext和 pli stTast组成 struct bucket *oListlast //整个 HashTab1的双链表 struct bucket *oNext // pNext和 plast用于组成某个hash对应 struct bucket *pLast //的双链表 char arkcy「11; // kcy 1 Bucket typedef struct ha uint nrablcsizc; uint nTEbleMask uint nNumCfElementsi NextFreeElement Bucket *pInternalfointer; / Used fcr element traversal * Bucket *plistHeac Bucket *plistTail Bucket **arBucketsi ash数组 c-or func t pLestructori / Hashtable初始化讨指定,销毁 Bucket时凋 用 zend bool persistent //是否采用C的内存分配例程 igned char nApplyCoun- zend bool bApplyProtection; +if ZEND DEBUG int inc #endif I HashTable; 总的来说,Zend的 HashTable是一种链表散列,同时也为线性 遍历进行了优化,图示如下: bucket arbuckets pListHcad pListTail iNternal Pointer HashTable里的两种数据结构 Hash Table中包含两种数据结构,一个链表散列和一个双向链 表,前者用于进行快速键-值査询,后者方便线性遍历和排序,一个 Bucket同时存在于这两个数据结构中 关于该数据结构的几点解释 链表散列中为什么使用双向链表? 般的链表散列只需要按key进行操作,只需要单链表就够了咱是 zend有时需要从链表散列中删除给定的 Bucket,使用双链表可以非 常高效的实现。 nTablemask是干什么的?

...展开详情
试读 42P PHP内核介绍及扩展开发指南.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
zk469906959 很好,不错的资料
2015-07-15
回复
童学芬 内容很全面,不错。谢谢版主
2014-12-05
回复
exVector 不错,正是我要找的。
2014-07-20
回复
gbyukg 非常不错的书,不过还是有点难度的。。。
2014-04-11
回复
deepgreen3 挺好的, 对zend引擎内部流程做了分析
2013-08-06
回复
cezhanlangg 很实用,非常感谢
2013-06-20
回复
dukong123 非常有用,对我开始自己的php编程很有帮助
2013-03-29
回复
zhangkekf 我就是看了这篇文章,才开始我的php扩展开发之旅的,特来回来评价,谢谢!
2013-02-26
回复
minilon 深入学习必备的资料,推荐!
2013-01-15
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
PHP内核介绍及扩展开发指南.pdf 9积分/C币 立即下载
1/42
PHP内核介绍及扩展开发指南.pdf第1页
PHP内核介绍及扩展开发指南.pdf第2页
PHP内核介绍及扩展开发指南.pdf第3页
PHP内核介绍及扩展开发指南.pdf第4页
PHP内核介绍及扩展开发指南.pdf第5页
PHP内核介绍及扩展开发指南.pdf第6页
PHP内核介绍及扩展开发指南.pdf第7页
PHP内核介绍及扩展开发指南.pdf第8页
PHP内核介绍及扩展开发指南.pdf第9页

试读结束, 可继续读4页

9积分/C币 立即下载 >