php网页执行流程,PHP程序的执行流程

PHP程序的执行流程

为了以后能开发PHP扩展,就一定要了解PHP的执行顺序。这篇文章就是为C开发PHP扩展做铺垫。

Web环境我们假设为Apache。在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块。Apache加载这个模块,在url访问.php文件的时候,就会转给mod_php5.so模块来处理。这个就是我们常说的SAPI。英文名字是:Server Application Programming Interface。SAPI其实是一个统称,其下有 ISAPI,CLI SAPI,CGI等。有了它,就可以很容易的跟其他东西交互,比如APACHE,IIS,CGI等。

Apache启动后会将 mod_pho5.so 模块的hook handler注册进来,当Apache检测到访问的url是一个php文件时,这时候就会把控制权交给SAPI。进入到SAPI后,首先会执行 sapi/apache/mod_php5.c 文件的 php_init_handler 函数,这里摘录一段代码:

static void php_init_handler(server_rec *s, pool *p)

{

register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);

if (!apache_php_initialized) {

apache_php_initialized = 1;

#ifdef ZTS

tsrm_startup(1, 1, 0, NULL);

#endif

sapi_startup(&apache_sapi_module);

php_apache_startup(&apache_sapi_module);

}

#if MODULE_MAGIC_NUMBER >= 19980527

{

TSRMLS_FETCH();

if (PG(expose_php)) {

ap_add_version_component("PHP/" PHP_VERSION);

}

}

#endif

}

该函数主要调用两个函数:

sapi_startup(&apache_sapi_module);

php_apache_startup(&apache_sapi_module);

SAPI_API void sapi_startup(sapi_module_struct *sf)

{

sf->ini_entries = NULL;

sapi_module = *sf;

.................

sapi_globals_ctor(&sapi_globals);

................

virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */

..................

reentrancy_startup();

}

sapi_startup 创建一个 sapi_globals_struct 结构体。*sapi_globals_struct 保存了Apache请求的基本信息,如服务器信息,Header,编码等。sapi_startup 执行完毕后再执行 php_apache_startup 。

static int php_apache_startup(sapi_module_struct *sapi_module)

{

if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {

return FAILURE;

} else {

return SUCCESS;

}

}

php_module_startup 内容太多,这里介绍一下大致的作用:

初始化 zend_utility_functions 结构.这个结构是设置zend的函数指针,比如错误处理函数,输出函数,流操作函数等.

设置环境变量.

加载php.ini配置.

加载php内置扩展.

写日志.

注册php内部函数集.

调用 php_ini_register_extensions, 加载所有外部扩展

开启所有扩展

一些清理操作.

重点说一下 3,4,7,8 加载php.ini配置

if (php_init_config(TSRMLS_C) == FAILURE) {

return FAILURE;

}

php_init_config 函数会在这里检查所有php.ini配置,并且找到所有加载的模块,添加到 php_extension_lists 结构中。

加载php内置扩展

调用 zend_register_standard_ini_entries 加载所有php的内置扩展,如array,mysql等。

调用 php_ini_register_extensions ,加载所有外部扩展。

main/php_ini.c

void php_ini_register_extensions(TSRMLS_D)

{

zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);

zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);

zend_llist_destroy(&extension_lists.engine);

zend_llist_destroy(&extension_lists.functions);

}

zend_llist_apply 函数遍历 extension_lists 执行会调用函数 php_load_php_extension_cb

static void php_load_zend_extension_cb(void *arg TSRMLS_DC)

{

zend_load_extension(*((char **) arg));

}

该函数最后调用

if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {

DL_UNLOAD(handle);

return FAILURE;

}

将扩展信息放到 Hash 表 module_registry 中,

Zend/zend_API.c

if (zend_hash_add(&module_registry, lcname, name_len+1, (void *)module, sizeof(zend_module_entry), (void**)&module_ptr)==FAILURE) {

zend_error(E_CORE_WARNING, "Module \'%s\' already loaded", module->name);

efree(lcname);

return NULL;

}

最后, zend_startup_modules(TSRMLS_C) 对模块进行排序,并检测是否注册到 module_registry HASH表里。zend_startup_extensions(); 执行 extension->startup(extension); 启动扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯物联网操作系统正式开源,最小体积仅1.8 KB

9月18日,腾讯宣布将开源自主研发的轻量级物联网实时操作系统TencentOS tiny。相比市场上其它系统,腾讯TencentOS tiny在资源占用、设备成本、功耗管理以及安全稳定等层面极具竞争力。该系统的开源可大幅降低物联网应用开发成本,提升开发效率&…

云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍

摘要: 本文带大家简单理解阿里巴巴Java开发手册中的规约内容以及P3C项目,可以帮助开发者扫描出所有潜在的代码隐患。在中间也聊了一些对于不同语言设计的理解,如何去看待语言的设计,其实是我们去学习一个语言的核心。演讲嘉宾简介…

你的数据安全么?Hadoop再曝安全漏洞| 黑客利用Hadoop Yarn资源管理系统未授权访问漏洞进行攻击

摘要: 4月30日,阿里云发现,俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。 Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理,Yarn是Hadoop集群的…

linux建立软连接

格式命令ln -s 源文件的绝对路径 目标文件的绝对路径ln -s /opt/libreoffice6.3/program/soffice /usr/bin/soffice需求把soffice 和/usr/bin/soffice 建立软连接现在执行命令/opt/libreoffice6.3/program/soffice --headless --invisible --convert-to pdf 3.19m.doc建立软连接…

博文强识|进阶企业大咖

出品 | CSDN云计算 每个周三周五,和小编共同分享优秀博文,一起遨游在知识的海洋。 你需要知道的那些 redis 数据结构(前篇) redis 对于团队中的同学们来说是非常熟悉的存在了,我们常用它来做缓存、或是实现分布式锁等…

php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例

本文主要和大家分享微信小程序模拟下拉菜单开发实例,希望能帮助到大家。一.知识点1.实现动态显示和隐藏某个控件列表1data:{open:false},showitem:function(){this.setData({open:!this.data.open})},.display_show{display: block;}.display_none{display: none;}2…

算法导论 pdf_学习数据结构和算法最好的书是什么?

-----------通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友。由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜。我这免费写给你看,多宣传原创作者是…

Tensorflow快餐教程(8) - 深度学习简史

摘要: 深度学习简史深度学习简史从机器学习流派说起如果要给机器学习划分流派的话,初步划分可以分为『归纳学习』和『统计学习』两大类。所谓『归纳学习』,就跟我们平时学习所用的归纳法差不多,也叫『从样例中学习』。归纳学习又分…

usb设备驱动程序(一)

代码&#xff1a; #include <linux/atomic.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/usb.h> #include <linux/videodev2.h> #include <linux…

linux 动态传参执行shell脚本

举个栗子&#xff1a; 我想执行的命令如下 /usr/bin/soffice --headless --invisible --convert-to pdf 3.doc但是这样命令就写死了&#xff0c;如何动态传参数&#xff0c;执行shell脚本呢&#xff1f; 步骤释义说明执行命令①创建一个2.sh的文件vim 2.sh②把通用的命令复制…

Tensorflow快餐教程(9) - 卷积

摘要&#xff1a; 卷积的计算方法卷积卷积就是滑动中提取特征的过程在数学中&#xff0c;卷积convolution是一种函数的定义。它是通过两个函数f和g生成第三个函数的一种数学算子&#xff0c;表征函数f与g经过翻转和平移的重叠部分的面积。其定义为&#xff1a;h(x)f(x)∗g(x)∫…

php websocket 连接已断开连接,客户端websocket 无法连接上PHP socket问题

我客户端是用c写得websocket客户端我请求的地址是ws://127.0.0.1:100322 (我请求ws://echo.websocket.org这个是可以的说明客户端代码是没问题的 问题就在服务端)输出[1405476678:7805] NOTICE: Initial logging level 7[1405476678:7806] NOTICE: Library version: 1.3 1544a2…

商家笑了 设计师哭了,京东+英特尔的AI这招太绝

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在如今“无促销不电商”的大环境熏陶下&#xff0c;商家需要榨干了脑浆想尽各种奇招&#xff0c;玩法虽多&#xff0c;但万变不离其宗。面对上万、甚至…

明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...

类型别名(type alias)一个名字&#xff0c;是某种类型的同义词。使用类型名有很多好处&#xff0c;能让复杂的类型名字变得简单明了&#xff0c;易于理解和使用。有两种方法可用于定义类型别名。传统的方法是使用关键字typedef :typedef double wages; //wages是double的同义词…

基于OGG Datahub插件将Oracle数据同步上云

摘要&#xff1a;随着数据规模的不断扩大&#xff0c;传统的RDBMS难以满足OLAP的需求&#xff0c;本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中&#xff0c;并利用大数据工具对数据进行分析。一、背景介绍随着数据规模的不断扩大&#xff0c;传统的RDBMS…

java执行linux脚本 并返回其执行结果

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List;/*** 执行脚本的工具类*/ public class ExecutionScriptUtils {public static List<Stri…

那些阿里的年轻人

摘要&#xff1a; 今天是年轻人的节日 十九年前&#xff0c;杭州城西一间狭小简陋的民房里 有一群年轻人 他们衣着朴素、口袋里也没什么钱 但每个人的眼神是坚定的、热烈的 他们每天挂在嘴边的 是梦想要做一件改变世界的事儿 1999年&#xff0c;一群杭州的年轻人离开北京&#…

anaconda+python3.7安装keras_win10(64)+python3.7+Anaconda3+tensorflow-cpu+Keras安装(亲测有效)...

1.安装准备&#xff1a;Anaconda3(内带python3.7.6)win10(64位)准备安装tensorflow-cpu版2.tensorflow和Keras对应版本(一定要对应&#xff0c;遇坑无数)3.创建Anaconda下的安装tensorflow所需的虚拟环境首先&#xff0c;配置国内的conda镜像源(不配置可能会遇到下载比较慢的问…

php的添加语句怎么写,php修改语句怎么写

php修改语句是“update student set 字段1新值1,…where id $id”,…;”&#xff0c;其中update语句就是用于修改数据库表中的数据。推荐&#xff1a;《PHP视频教程》PHP sql修改语句语法&#xff1a;$sql “update student set 字段1新值1,…where id $id”,…;注意&#xff…

招人!入职阿里仅1年,我和做AI的程序员薪资翻了2倍!

最近在知乎上&#xff0c;关于AI的这个话题又被顶起来&#xff0c;其中&#xff0c;这条回答让人印象深刻&#xff1a;在这短短的一条信息里&#xff0c;无疑显示出&#xff1a;AI行业缺人&#xff0c;高端岗位80万年薪恐怕也招不来&#xff01;小编上周在一个AI群里&#xff0…