BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


奥运快报: 
奥运热点:
 

精华帖子 [翻译]编写扩展(全部提交) - Extension Writing - Sara Golemon
首页 » 论坛 » Php »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
  本主题由 HonestQiao 于 2007-12-24 17:08 加入精华 
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2007-12-13 17:51 
序言:

首先感谢 抚琴居主人在《Zend API,深入 PHP 内核》方面所作的工作,受教良多。原文是PHP文档的PHP at the Core: A Hacker's Guide to the Zend Engine部分的一个章节,是针对PHP 4的,讲的是Zend引擎 1,最新更新时间也是2004年,而PHP 5也有3个年头了,其内部的实现有了很多变化。PHP 5发布以后,Sara Golemon不定时发表了几篇“新版”的《Extension Writing》系列文章(到现在只有4篇 ),当然,到现在也有年头了,关于扩展开发的“最新资料”,可以参考《php|tek 2007 落幕,众大牛的演讲幻灯片陆续放出~》上提供的Sara Golemon的幻灯片PHP Extension Writing


还要感谢我的老婆,容忍了我因此带来的无聊周末  ^_^

译文还有很多问题,恳请大家指正!!!

下面开始正文:

(奇怪:怎么不能给链接上色???)

发贴功能好奇怪,格式全乱了,我是用Firefox插件ScrapBook抓的网页,直接把翻译改在上面了,打包放在附件中.




[ 本帖最后由 hshq_cn 于 2007-12-21 12:32 编辑 ]



2007-12-13 18:05
  下载次数: 173
前3篇.zip (38.25 KB)
 
2007-12-21 12:32
  下载次数: 130
第四篇.zip (11.57 KB)
 


您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2007-12-13 17:55 
编写扩展 I:PHP和Zend起步

介绍
扩展是什么?
生存周期
内存分配
建立构建环境
Hello World
构建你的扩展
初始设置(INI)
全局数值
初始设置(INI)作为全局数值
核对(代码)完整性
下一步是什么?


介绍

既然您正在阅读本教程,那么您或许对编写PHP语言的扩展感兴趣。如果不是...呃,或许你并不知道这一兴趣,那么我们结束的时候你就会发现它。
本教程假定您基本熟悉PHP语言及其解释器实现所用的语言:C.
让我们从指明为什么你想要编写PHP扩展开始。
  • 限于PHP语言本身的抽象程度,它不能直接访问某些库或特定于操作系统的调用。
  • 你想要通过某些不平常的方法定制PHP的行为。
  • 你有一些现成的PHP代码,但是你知道它可以(运行)更快、(占用空间)更小,而且消耗更少的内存。
  • 你有一些不错的代码出售,买家可以使用它,但重要的是不能看到源代码。
这些都是非常正当的理由,但是,在创建扩展之前,你需要首先明白扩展是什么?

[ 本帖最后由 hshq_cn 于 2007-12-13 17:58 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2007-12-13 17:58 
扩展是什么?

如果你用过PHP,那么你肯定用到过扩展。除了少数例外,每个用户空间的函数都被组织在不同的扩展中。这些函数中的很多够成了standard扩展-总数超过400。PHP本身带有86个扩展(原文写就之时-译注),平均每个含有大约30个函数。数学操作方面大约有2500个函数。似乎这还不够, PECL仓库另外提供了超过100个扩展,而且互联网上可以找到更多。
“除了扩展中的函数,还有什么?”我听到了你的疑问。“扩展的里面是什么?PHP的‘核心’是什么?”
PHP的核心由两部分组成。最底层是Zend引擎(ZE)。ZE把人类易读的脚本解析成机器可读的符号,然后在进程空间内执行这些符号。ZE也处理内存管理、变量作用域及调度程序调用。另一部分是PHP内核,它绑定了SAPI层(Server Application Programming Interface,通常涉及主机环境,如Apache,IIS,CLI,CGI等),并处理与它的通信。它同时对safe_mode和open_basedir的检测提供一致的控制层,就像流层将fopen()、fread()和fwrite()等用户空间的函数与文件和网络I/O联系起来一样。

生存周期

当给定的SAPI启动时,例如在对/usr/local/apache/bin/apachectl start的响应中,PHP由初始化其内核子系统开始。在接近启动例程的末尾,它加载每个扩展的代码并调用其模块初始化例程(MINIT)。这使得每个扩展可以初始化内部变量、分配资源、注册资源处理器,以及向ZE注册自己的函数,以便于脚本调用这其中的函数时候ZE知道执行哪些代码。
接下来,PHP等待SAPI层请求要处理的页面。对于CGI或CLI等SAPI,这将立刻发生且只发生一次。对于Apache、IIS或其他成熟的web服务器SAPI,每次远程用户请求页面时都将发生,因此重复很多次,也可能并发。不管请求如何产生,PHP开始于要求ZE建立脚本的运行环境,然后调用每个扩展的请求初始化(RINIT)函数。RINIT使得扩展有机会设定特定的环境变量,根据请求分配资源,或者执行其他任务,如审核。 session扩展中有个RINIT作用的典型示例,如果启用了session.auto_start选项,RINIT将自动触发用户空间的session_start()函数以及预组装$_SESSION变量。
一旦请求被初始化了,ZE开始接管控制权,将PHP脚本翻译成符号,最终形成操作码并逐步运行之。如任一操作码需要调用扩展的函数,ZE将会把参数绑定到该函数,并且临时交出控制权直到函数运行结束。
脚本运行结束后,PHP调用每个扩展的请求关闭(RSHUTDOWN)函数以执行最后的清理工作(如将session变量存入磁盘)。接下来,ZE执行清理过程(垃圾收集)-有效地对之前的请求期间用到的每个变量执行unset()。
一旦完成,PHP继续等待SAPI的其他文档请求或者是关闭信号。对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。关闭期间,PHP再次遍历每个扩展,调用其模块关闭(MSHUTDOWN)函数,并最终关闭自己的内核子系统。
这个过程乍听起来很让人气馁,但是一旦你深入一个运转的扩展,你会逐渐开始了解它。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2007-12-13 17:59 
内存分配为了避免写的不好的扩展丢失内存,ZE使用附加的标志来执行自己内部的内存管理器以标识持久性。持久分配的内存意味着比单次请求更持久。对比之下,对于在请求期间的非持久分配,不论是否调用释放(内存)函数,都将在请求尾期被释放。例如,用户空间的变量被分配为非持久的,因为请求结束后它们就没用了。
然而,理论上,扩展可以依赖ZE在页面请求结束时自动释放非持久内存,但是不推荐这样做。因为分配的内存将在很长时间保持为未回收状态,与之相关联的资源可能得不到适当的关闭,并且吃饭不擦嘴是坏习惯。稍后你会发现,事实上确保所有分配的数据都被正确清理很容易。
让我们简单地比较传统的内存分配函数(只应当在外部库中使用)和PHP/ZE的持久的以及非持久的内存非配函数。
  [tr]    传统的    非持久的    持久的  [/tr]            
malloc(count)
      calloc(count, num)   
emalloc(count)
      ecalloc(count, num)   
pemalloc(count, 1)*
    pecalloc(count, num, 1)   
strdup(str)
      strndup(str, len)   
estrdup(str)
    estrndup(str, len)   
pestrdup(str, 1)
      pemalloc() & memcpy()   
free(ptr)efree(ptr)pefree(ptr, 1)
realloc(ptr, newsize)erealloc(ptr, newsize)perealloc(ptr, newsize, 1)
malloc(count * num + extr)**safe_emalloc(count, num, extr)safe_pemalloc(count, num, extr)
    * pemalloc()族包含一个‘持久’标志以允许它们实现对应的非持久函数的功能。
       例如:emalloc(1234)与pemalloc(1234, 0)相同。

    ** safe_emalloc()和(PHP 5中的)safe_pemalloc()执行附加检测以防整数溢出。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2007-12-21 12:33 
提交第四篇的翻译,在主题中的第二个附件。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
hshq_cn   帅哥
精灵




UID:372137
注册:2006-2-14
最后登录: 2008-09-05
帖子:246
精华:2

可用积分:260 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2007-12-21 14:15 
博克开张,把相关的内容稍稍编辑了放入其中:

http://hshqcn.cublog.cn/



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
傲枭   帅哥
光明使者


CU奥运火炬传递手2008
UID:262168
注册:2005-4-30
最后登录: 2008-09-02
帖子:805
精华:1

可用积分:1467 (家境小康)
信誉积分:105
专家积分:0 (本版:0)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2007-12-21 14:29 
还没看内容,一看题目就喜欢...



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
rf123
圣骑士




UID:470821
注册:2006-9-28
最后登录: 2008-08-14
帖子:89
精华:0

可用积分:36 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2007-12-21 17:17 
很好,支持!



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
usen68   帅哥
侠客



UID:623669
注册:2007-10-1
最后登录: 2008-09-06
帖子:30
精华:0

可用积分:30 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:河南郑州
状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-1-6 00:49 
收藏了。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

usen68强烈支持!顶顶!!
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
~wind~
光明使者




UID:182176
注册:2004-9-9
最后登录: 2008-09-03
帖子:709
精华:0

可用积分:799 (稍有积蓄)
信誉积分:100
专家积分:5 (本版:0)
空间积分:2
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-1-8 09:14 
已下载,收藏



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

网闸
网闸价格
3G电话
3G手机
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘

首页 » 论坛 » Php »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.078100 second(s), 6 queries , Gzip enabled