PHP模块开发学习心得

最近在学习PHP模块开发相关的知识, 再看了dl()函数的流程之后, 对模块加载的处理流程做一个总结, 希望可以在PHP模块开发上帮助到大家.

进入正题.

PHP的代码架构

上图摘自Extending and Embedding PHP(Sams).

从图中可以看出, PHP所有的部分都处在一个被称为TSRM的层中, TSRM层是负责线程安全管理的. 最底下的SAPI是对外提供服务的接口, 比如命令行的sapi为cli, php-fpm则是fastcgi的sapi, apache的模块方式也是一种sapi.

中间是PHP内核和Zend 引擎. 从图中的文字可以看出, PHP内核负责请求管理/网络和文件操作, Zend内核则负责编译和执行/内存和资源的分配.

在所有这些之上, 是扩展层, PHP中多数对外接口都是通过扩展层来提供的, 比如, standard, string等语言基础也被以扩展形式提供.

扩展(以后称为模块)加载到PHP中的方式有两种: 静态编译, 动态链接.

静态编译需要重新生成php的configure脚本, 这里不再赘述. 动态链接方式是将模块编译为一个.so文件, 然后动态的加载到php中.

加载.so文件的方式有两种, 一种是将其写到php.ini文件中, 比如: extension=apc.so, 另外一种就是在代码中使用dl(‘xxx.so’).

dl($library)

函数的作用就是把一个模块加载进来, 使其内部提供的能力可用.

dl()函数的源代码在PHP源代码根目录(简写为PHP_SRC_HOME)下, PHP_SRC_HOME/ext/standard/dl.c, 处理关键流程如下:

PHP_FUNCTION(dl)

PHPAPI PHP_FUNCTION(dl)
{
    //...
    php_dl(filename, MODULE_TEMPORARY, return_value, 0 TSRMLS_CC);
    //...
}

php_dl

PHPAPI void php_dl(char *file, int type, zval *return_value, int start_now TSRMLS_DC)
{
    if (php_load_extension(file, type, start_now TSRMLS_CC) == FAILURE) {
       //...
}

php_load_extension

PHPAPI int php_load_extension(char *filename, int type, int start_now TSRMLS_DC) {
    //文件名解析相关  

    //加载动态链接库
    handle = DL_LOAD(libpath);  

    //加载错误处理  

    //获取模块的get_module函数(重点, 模块初始入口)
    get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module");  

    //get_module函数获取错误处理  

    //那个get_module()得到struct zend_module_entry
    module_entry = get_module();
    //...  

    //注册模块(重点, 函数在这里被注册)
    if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {
        //错误处理
    }  

    //模块启动(重点, PHP_MINIT_FUNCTION)
    if ((type == MODULE_TEMPORARY || start_now) && zend_startup_module_ex(module_entry TSRMLS_CC) == FAILURE) {
        //错误处理
    }  

    //模块请求启动(重点, PHP_RINIT_FUNCTION)
    if ((type == MODULE_TEMPORARY || start_now) && module_entry->request_startup_func) {
        //错误处理
    }
    return SUCCESS;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 函数
, 模块
, 错误
, 处理
, php网站开发流程
, module函数
, 重点函数
, dl
php内核学习教程
,以便于您获取更多的相关知识。

时间: 2024-08-03 12:49:43

PHP模块开发学习心得的相关文章

Web开发学习心得5——Asp.net的设计思想

自从有了html与http,就有了浏览器与Web服务器,并有了Web应用,最初的交互模式是这样的: 开发学习心得5--Asp.net的设计思想-">该模式很好地运行了很多年.然而,随着计算机应用的发展,人们越来越不满足于只有静态内容的页面,而由某种机制动态产生html等代码的需求越来越迫切,于是,很多技术就应运而生,Asp.net就是这样一种技术.从本质上讲,Asp.net就是一种服务器端动态产生html.css.javascript等浏览器认识的代码的技术.Asp.net的交互模式如下:

Web开发学习心得6——HttpApplication管线研究

经过Asp.net设计思想的研究,我们对HttpApplication的管线已经有了一个本质的了解.所谓管线,实际上就是生产流水线,由一系列的步骤所组成,而HttpContext,就是这条流水线上待加工的产品.现在,我们来对这条生产流水线进行更进一步的了解. 首先请看ApplicationStepManager.BuildSteps方法. 开发学习心得6--HttpApplication管线研究-">1.ValidatePathExecutionStep:负责对请求的路径进行安全检查,禁止

Web开发学习心得4——CSS盒模式与排版

首先简单讲一下盒模式,所谓盒模式,是CSS看待元素的方式,CSS将每个单一的元素都看作一个盒子,如下图所示: 开发学习心得4--CSS盒模式与排版-">之所以叫它盒模式,是因为它跟我们日常生活中的盒子非常相似,这里不多说了.CSS中大部分的属性都是用来控制content的,比如width.height.color等:padding.border.margin都是可选的,其中,padding.margin表示的是一片空白区域,只能控制其大小,border是一个可见的边框,可以控制其边框样式.

Web开发学习心得2——HTML的结构

现在我们来学习HTML的结构(我们只讨论严格型的,也包括XHTML). 首先给出一份严格的HTML的一些常见的规则: 1.网页总以一个DOCTYPE开始,紧接着,<html>元素必须出现在网页的开头和结尾. 2.只有<head>.<body>元素可以直接包含于<html>中,其他任何元素都必须包含于<head>或<body>中. 3.必须给<head>元素一个<title>元素. 4.只能在<body&g

Web开发学习心得1——什么是HTML,XHTML

Web世界发现到现在,已经有了一套比较完善的体系,这套体系的基础就是HTML+CSS. 最初的HTML不仅标记结构,也标记网页如何展现.因此,就出现了如<p>这样的表示结构的元素与<center>这样的表示展现的元素混杂的局面.那个时候还没有CSS. 后来有了专门表示展现的CSS,人们发现,应该把HTML进行一番清洗整理,使HTML只表示结构,而把如何展现的责任完全交给CSS.该设想得到了绝大多数的支持,因此,W3C在1999年末制定了HTML4.01(也是目前的最新版本),该标准

Web开发学习心得7——MasterPage的实现原理

MasterPage是Asp.net2.0引入的一个非常实用的特性,怎么用,我想不用我说,基本上大家都会,这里要讲的是,它是如何实现的. 在深入源代码去探索MasterPage之前,我以为MasterPage的实现应该是比较复杂的,也一直纳闷为什么MasterPage类会继承于UserControl类,感觉这两者好像差得很远.昨天晚上,我专门抽出时间,阅读了部分与MasterPage有关的源代码,终于明白了是怎么回事,在那突然明白的那一刻,真有如醍醐灌顶,拍案叫绝,不得不佩服微软的那些guys.

Web开发学习心得3——CSS的语法与层叠

这篇主要讨论CSS的语法及层叠的概念,有关CSS布局方面的内容下篇讨论. 如前两篇文章所述,CSS是专门用来负责文档的展现的,那既然如此,CSS就一定能够控制每种元素的展现,于是,就有了第一类语法--元素选择符. 元素选择符语法如下: element { 样式规则 } 这个非常好理解,所谓元素选择符,就是说文档中所有该元素,都以该样式规则显示. 非常好,有了元素选择符,就能够很大程度上控制文档的展现了.然而,人们很快就碰到了新的问题:我有两个相同的元素,但是我希望两个元素以不同的样式展现.为了满

转贴: wolfenstein工作室-eMule源代码学习心得

1, eMule源代码学习心得(1):eMule代码的总体风格和其它相关工程 eMule的官方首页上写着:2002年05月13日 一个叫做 Merkur 的人,他不满意原始eDonkey2000客户端并且坚信他能够做的更好,所以他开始制作.他聚集了其它开发人员在他的周围,并且eMule工程就此诞生. eMule是一个典型的MFC程序,它的图形界面等,已经和MFC紧紧融合到了一起.因此通常情况下它只能在windows平台下运行.有一些其它的工程,如aMule等,把它进行了移植,因此跨平台的功能要强

我的Java开发学习之旅------&amp;gt;Java经典面试题

摘自张孝祥itcast 从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴迷和爱好程序,并且在这方面有一些天赋和优势.程序员的结局也是有两种:第一,默默退休,第二以程序员为起点或跳板,注意积累,跟对了好的老板或团队,找到和很好的搭档自己创业,成为IT金领和富翁." 人们在时间面前是平等的,吾生也有涯,所以,你的经验更丰富点,那不算什么,经验是用时间积累的