欢迎来到天天文库
浏览记录
ID:33316415
大小:886.36 KB
页数:114页
时间:2019-02-24
《PHP扩展开发中文教程》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、编写扩展I:PHP和Zend起步编写扩展I:PHP和Zend起步扩展教程bySaraGolemon
2、Monday,February28,2005介绍扩展是什么?生存周期内存分配建立构建环境HelloWorld构建你的扩展初始设置(INI)全局数值初始设置(INI)作为全局数值核对(代码)完整性下一步是什么?介绍既然您正在阅读本教程,那么您或许对编写PHP语言的扩展感兴趣。如果不是...呃,或许你并不知道这一兴趣,那么我们结束的时候你就会发现它。本教程假定您基本熟悉PHP语言及其解释器实现所用的语言:C.让我们从指明为什么你想要编写
3、PHP扩展开始。1.限于PHP语言本身的抽象程度,它不能直接访问某些库或特定于操作系统的调用。2.你想要通过某些不平常的方法定制PHP的行为。3.你有一些现成的PHP代码,但是你知道它可以(运行)更快、(占用空间)更小,而且消耗更少的内存。4.你有一些不错的代码出售,买家可以使用它,但重要的是不能看到源代码。这些都是非常正当的理由,但是,在创建扩展之前,你需要首先明白扩展是什么?扩展是什么?如果你用过PHP,那么你肯定用到过扩展。除了少数例外,每个用户空间的函数都被组织在不同的扩展中。这些函数中的很多够成了standard扩展-总
4、数超过400。PHP本身带有86个扩展(原文写就之时-译注),平均每个含有大约30个函数。数学操作方面大约有2500个函数。似乎这还不够,PECL仓库另外提供了超过100个扩展,而且互联网上可以找到更多。“除了扩展中的函数,还有什么?”我听到了你的疑问。“扩展的里面是什么?PHP的‘核心’是什么?”PHP的核心由两部分组成。最底层是Zend引擎(ZE)。ZE把人类易读的脚本解析成机器可读的符号,然后在进程空间内执行这些符号。ZE也处理内存管理、变量作用域及调度程序调用。另一部分是PHP内核,它绑定了SAPI层(ServerAppl
5、icationProgrammingInterface,通常涉及主机环境,如Apache,IIS,CLI,CGI等),并处理与它的通信。它同时对safe_mode和open_basedir的检测提供一致的控制层,就像流层将fopen()、fread()和fwrite()等用户空间的函数与文件和网络I/O联系起来一样。1file:///C
6、/DocumentsandSettings/Administrator/桌面/ExtensionWriting(CN)/part1.html[2009-10-2915:52:09]编写扩展I:PH
7、P和Zend起步生存周期当给定的SAPI启动时,例如在对/usr/local/apache/bin/apachectlstart的响应中,PHP由初始化其内核子系统开始。在接近启动例程的末尾,它加载每个扩展的代码并调用其模块初始化例程(MINIT)。这使得每个扩展可以初始化内部变量、分配资源、注册资源处理器,以及向ZE注册自己的函数,以便于脚本调用这其中的函数时候ZE知道执行哪些代码。接下来,PHP等待SAPI层请求要处理的页面。对于CGI或CLI等SAPI,这将立刻发生且只发生一次。对于Apache、IIS或其他成熟的web服务
8、器SAPI,每次远程用户请求页面时都将发生,因此重复很多次,也可能并发。不管请求如何产生,PHP开始于要求ZE建立脚本的运行环境,然后调用每个扩展的请求初始化(RINIT)函数。RINIT使得扩展有机会设定特定的环境变量,根据请求分配资源,或者执行其他任务,如审核。session扩展中有个RINIT作用的典型示例,如果启用了session.auto_start选项,RINIT将自动触发用户空间的session_start()函数以及预组装$_SESSION变量。一旦请求被初始化了,ZE开始接管控制权,将PHP脚本翻译成符号,最终形
9、成操作码并逐步运行之。如任一操作码需要调用扩展的函数,ZE将会把参数绑定到该函数,并且临时交出控制权直到函数运行结束。脚本运行结束后,PHP调用每个扩展的请求关闭(RSHUTDOWN)函数以执行最后的清理工作(如将session变量存入磁盘)。接下来,ZE执行清理过程(垃圾收集)-有效地对之前的请求期间用到的每个变量执行unset()。一旦完成,PHP继续等待SAPI的其他文档请求或者是关闭信号。对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。关闭期间,PHP再次遍历每个扩展,调用其模块关闭(MSHUT
10、DOWN)函数,并最终关闭自己的内核子系统。这个过程乍听起来很让人气馁,但是一旦你深入一个运转的扩展,你会逐渐开始了解它。内存分配为了避免写的不好的扩展丢失内存,ZE使用附加的标志来执行自己内部的内存管理器以标识持久性。持久分配的内存意味着比单次请
此文档下载收益归作者所有