免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hshq_cn
打印 上一主题 下一主题

[翻译]编写扩展(全部提交) - Extension Writing - Sara Golemon [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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 编辑 ]

前3篇.zip

38.25 KB, 下载次数: 428

第四篇.zip

11.57 KB, 下载次数: 350

论坛徽章:
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
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
4 [报告]
发表于 2007-12-13 17:59 |显示全部楼层
内存分配为了避免写的不好的扩展丢失内存,ZE使用附加的标志来执行自己内部的内存管理器以标识持久性。持久分配的内存意味着比单次请求更持久。对比之下,对于在请求期间的非持久分配,不论是否调用释放(内存)函数,都将在请求尾期被释放。例如,用户空间的变量被分配为非持久的,因为请求结束后它们就没用了。
然而,理论上,扩展可以依赖ZE在页面请求结束时自动释放非持久内存,但是不推荐这样做。因为分配的内存将在很长时间保持为未回收状态,与之相关联的资源可能得不到适当的关闭,并且吃饭不擦嘴是坏习惯。稍后你会发现,事实上确保所有分配的数据都被正确清理很容易。
让我们简单地比较传统的内存分配函数(只应当在外部库中使用)和PHP/ZE的持久的以及非持久的内存非配函数。
      传统的    非持久的    持久的        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
5 [报告]
发表于 2007-12-21 12:33 |显示全部楼层
提交第四篇的翻译,在主题中的第二个附件。

论坛徽章:
0
6 [报告]
发表于 2007-12-21 14:15 |显示全部楼层
博克开张,把相关的内容稍稍编辑了放入其中:

http://hshqcn.cublog.cn/

论坛徽章:
0
7 [报告]
发表于 2008-01-17 09:25 |显示全部楼层

回复 #16 ysixin 的帖子

msn:magic at popenglish.tv
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP