php源码之路第二章第二节(SAPI概述之Apache模块)

Oracle EBS FA 创建成批增加执行时间长且报错 摘要 Oracle EBS系统在执行"创建成批增"请求时出现长时间运行并报错(ORA-00603和ORA-03114)。 阅读详情
生命周期的各个阶段,SAPI接口关系到很多服务的操作的实现,这些内置实现的物理位置在PHP源码的SAPI目录。这个目录存放了PHP对各个服务器抽象层的代码,例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等。

各个服务器抽象层之间遵守着相同的协议,我们称之为SAPI的接口。

SAPI的示意图

以cgi模式和apache2服务器为例,它们的启动方法如下:

cgi_sapi_module.startup(&cgi_sapi_module)   //  cgi模式 cgi/cgi_main.c文件

apache2_sapi_module.startup(&apache2_sapi_module);
 //  apache2服务器  apache2handler/sapi_apache2.c文件
这里的cgi_sapi_module是sapi_module_struct结构体的静态变量。它的startup方法指向php_cgi_startup函数指针。在这个结构体中除了startup函数指针,还有许多其它方法或字段。
  1. startup 当SAPI初始化时,首先会调用该函数。如果服务器处理多个请求时,该函数只会调用一次。比如Apache的SAPI,它是以mod_php5的Apache模块的形式加载到Apache中的,在这个SAPI中,startup函数只在父进程中创建一次,在其fork的子进程中不会调用。

  2. activate 此函数会在每个请求开始时调用,它会再次初始化每个请求前的数据结构。

  3. deactivate 此函数会在每个请求结束时调用,它用来确保所有的数据都,以及释放在activate中初始化的数据结构。

  4. shutdown 关闭函数,它用来释放所有的SAPI的数据结构、内存等。

  5. ub_write 不缓存的写操作(unbuffered write),它是用来将PHP的数据输出给客户端,如在CLI模式下,其最终是调用fwrite实现向标准输出输出内容;在Apache模块中,它最终是调用Apache提供的方法rwrite。

  6. sapi_error 报告错误用,大多数的SAPI都是使用的PHP的默认实现php_error。

  7. flush 刷新输出,在CLI模式下通过使用C语言的库函数fflush实现,在php_mode5模式下,使用Apache的提供的函数函数rflush实现。

  8. read_cookie 在SAPI激活时,程序会调用此函数,并且将此函数获取的值赋值给SG(request_info).cookie_data。在CLI模式下,此函数会返回NULL。

  9. read_post 此函数和read_cookie一样也是在SAPI激活时调用,它与请求的方法相关,当请求的方法是POST时,程序会操作POST、HTTP_RAW_POST_DATA等变量。

  10. send_header 发送头部信息,此方法一般的SAPI都会定制,其所不同的是,有些的会调服务器自带的(如Apache),有些的需要你自己实现(如 FastCGI)。

以上的这些结构在各服务器的接口实现中都有定义。如Apache2的定义:

static sapi_module_struct apache2_sapi_module = {    "apache2handler",    "Apache 2.0 Handler",     php_apache2_startup,                /* startup */
    php_module_shutdown_wrapper,            /* shutdown */     ...}
目前PHP内置的很多SAPI实现都已不再维护或者变的有些非主流了,PHP社区目前正在考虑将一些SAPI移出代码库。 社区对很多功能的考虑是除非真的非常必要,或者某些功能已近非常通用了,否则就在PECL库中, 例如非常流行的APC缓存扩展将进入核心代码库中。

    整个SAPI类似于一个面向对象中的模板方法模式的应用。 SAPI.c和SAPI.h文件所包含的一些函数就是模板方法模式中的抽象模板,各个服务器对于sapi_module的定义及相关实现则是一个个具体的模板。

    这样的结构在PHP的源码中有多处使用,比如在PHP扩展开发中,每个扩展都需要定义一个zend_module_entry结构体。这个结构体的作用与sapi_module_struct结构体类似,都是一个类似模板方法模式的应用。在PHP的生命周期中如果需要调用某个扩展,其调用的方法都是zend_module_entry结构体中指定的方法,如在上一小节中提到的在执行各个扩展的请求初始化时,都是统一调用request_startup_func方法,而在每个扩展的定义时,都通过宏PHP_RINIT指定request_startup_func对应的函数。以VLD扩展为例:其请求初始化为PHP_RINIT(vld),与之对应在扩展中需要有这个函数的实现:
PHP_RINIT_FUNCTION(vld) {
}
所以, 我们在写扩展时也需要实现扩展的这些接口,同样,当实现各服务器接口时也需要实现其对应的SAPI。

然后我们说一下下面分布的三个部分,apache模块,嵌入式,和FastCGI

首先是Apache模块,apache的模块是怎么加载的呢?我们以之前提到的mod_php5模块为例子,我们首先需要更改apache的配置文件http.conf

LoadModule php5_module modules/mod_php5.so
    这里我们使用LoadModule命令,第一个参数是模块名称,第二个参数是模块路径。模块的名称我们可以在php的源码中,当需要调用服务的时候可以发送HUP或者AP_SIG_GRACEFUL给服务器,一旦接收到HUP或者AP_SIG_GRACEFUL信号,Apache将重新加载模块,而不是重新启动服务器。

在配置文件中添加上述命令以后,Apache会按照模块名来加载模块,Apache必须保证其文件名是以“mod_”开始的,如PHP的mod_php5.c。如果命名格式不对,Apache将认为此模块不合法。Apache的每一个模块都是以module结构体的形式存在。
在真正激活模块之前,Apache会检查所加载的模块是否为真正的Apache模块,这个检测是通过检查module结构体中的magic字段实现的。而magic字段是通过宏STANDARD20_MODULE_STUFF体现,在这个宏中magic的值为MODULE_MAGIC_COOKIE, MODULE_MAGIC_COOKIE定义如下:
#define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */
最后Apache会调用相关函数(ap_add_loaded_module)将模块激活,此处的激活就是将模块放入相应的链表中(ap_top_modules链表: ap_top_modules链表用来保存Apache中所有的被激活的模块,包括默认的激活模块和激活的第三方模块。)

Apache加载的是PHP模块,那么这个模块是如何实现的呢到我们以Apache2的mod_php5模块为例进行说明。

Apache2的mod_php5模块说明

AP_MODULE_DECLARE_DATA module php5_module = {
    STANDARD20_MODULE_STUFF,
        /* 宏,包括版本,小版本,模块索引,模块名,下一个模块指针等信息,其中模块名以__FILE__体现 
        */ create_php_config, /* create per-directory config structure */
    merge_php_config, /* merge per-directory config structures */
    NULL,  /* create per-server config structure */
    NULL,   /* merge per-server config structures */
    php_dir_cmds,  /* 模块定义的所有的指令 */
    php_ap2_register_hook
   /* 注册钩子,此函数通过ap_hoo_开头的函数在一次请求处理过程中对于指定的步骤注册钩子 */
};
const command_rec php_dir_cmds[] ={
    AP_INIT_TAKE2("php_value", php_apache_value_handler, NULL,        OR_OPTIONS, "PHP Value Modifier"),
    AP_INIT_TAKE2("php_flag", php_apache_flag_handler, NULL,        OR_OPTIONS, "PHP Flag Modifier"),
    AP_INIT_TAKE2("php_admin_value", php_apache_admin_value_handler,        NULL, ACCESS_CONF|RSRC_CONF, "PHP Value Modifier (Admin)"),
    AP_INIT_TAKE2("php_admin_flag", php_apache_admin_flag_handler,
        NULL, ACCESS_CONF|RSRC_CONF, "PHP Flag Modifier (Admin)"),
    AP_INIT_TAKE1("PHPINIDir", php_apache_phpini_set, NULL,        RSRC_CONF, "Directory containing the php.ini file"),    {NULL}};
这是mod_php5模块定义的指令表。它实际上是一个command_rec结构的数组。当Apache遇到指令的时候将逐一遍历各个模块中的指令表,查找是否有哪个模块能够处理该指令,如果找到,则调用相应的处理函数,如果所有指令表中的模块都不能处理该指令,那么将报错。如上可见,mod_php5模块仅提供php_value等5个指令。

php_ap2_register_hook函数的定义如下:

void php_ap2_register_hook(apr_pool_t *p){
    ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);}

        以上代码声明了pre_config,post_config,handler和child_init 4个挂钩以及对应的处理函数。其中pre_config,post_config,child_init是启动挂钩,它们在服务器启动时调用。

     handler挂钩是请求挂钩,它在服务器处理请求时调用。其中在post_config挂钩中启动php。它通过php_apache_server_startup函数实现。
php_apache_server_startup函数通过调用sapi_startup启动sapi,并通过调用php_apache2_startup来注册sapi module struct(此结构在本节开头中有说明),最后调用php_module_startup来初始化PHP, 其中又会初始化Zend引擎,以及填充zend_module_struct中的treat_data成员(通过php_startup_sapi_content_types)等。

到这里,我们知道了Apache加载mod_php5模块的整个过程,可是这个过程与我们的SAPI有什么关系呢? mod_php5也定义了属于Apache的sapi_module_struct结构:
static sapi_module_struct apache2_sapi_module = {
"apache2handler",
"Apache 2.0 Handler",

php_apache2_startup,                /* startup */
php_module_shutdown_wrapper,            /* shutdown */

NULL,                       /* activate */
NULL,                       /* deactivate */

php_apache_sapi_ub_write,           /* unbuffered write */
php_apache_sapi_flush,              /* flush */
php_apache_sapi_get_stat,           /* get uid */
php_apache_sapi_getenv,             /* getenv */

php_error,                  /* error handler */

php_apache_sapi_header_handler,         /* header handler */
php_apache_sapi_send_headers,           /* send headers handler */
NULL,                       /* send header handler */

php_apache_sapi_read_post,          /* read POST data */
php_apache_sapi_read_cookies,           /* read Cookies */

php_apache_sapi_register_variables,
php_apache_sapi_log_message,            /* Log message */
php_apache_sapi_get_request_time,       /* Request Time */
NULL,                       /* Child Terminate */

STANDARD_SAPI_MODULE_PROPERTIES
};
这些方法都专属于Apache服务器。以读取cookie为例,当我们在Apache服务器环境下,在PHP中调用读取Cookie时,最终获取的数据的位置是在激活SAPI时。它所调用的方法是read_cookies。
SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);
对于每一个服务器在加载时,我们都指定了sapi_module,而Apache的sapi_module是apache2_sapi_module。其中对应read_cookies方法的是php_apache_sapi_read_cookies函数。

又如flush函数,在ext/standard/basic_functions.c文件中,其实现为sapi_flush:
SAPI_API int sapi_flush(TSRMLS_D)
{
    if (sapi_module.flush) {
        sapi_module.flush(SG(server_context));
        return SUCCESS;
    } else {
        return FAILURE;
    }
}
    如果我们定义了此前服务器接口的flush函数,则直接调用flush对应的函数,返回成功,否则返回失败。对于我们当前的Apache模块,其实现为php_apache_sapi_flush函数,最终会调用Apache的ap_rflush,刷新apache的输出缓冲区。当然,flush的操作有时也不会生效,因为当PHP执行flush函数时,其所有的行为完全依赖于Apache的行为,而自身却做不了什么,比如启用了Apache的压缩功能,当没有达到预定的输出大小时,即使使用了flush函数,Apache也不会向客户端输出对应的内容。

Apache的运行过程:

Apache的运行分为启动阶段和运行阶段。在启动阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(*nix系统)或超级管理员Administrator(Windows系统)完成启动,并且整个过程处于一个单进程单线程的环境中。这个阶段包括配置文件解析(如http.conf文件)、模块加载(如mod_php,mod_perl)和系统资源初始化(例如日志文件、共享内存段、数据库连接等)等工作。

Apache的启动阶段执行了大量的初始化操作,并且将许多比较慢或者花费比较高的操作都集中在这个阶段完成,以减少了后面处理请求服务的压力。

在运行阶段,Apache主要工作是处理用户的服务请求。在这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞。 Apache对HTTP的请求可以分为连接、处理和断开连接三个大的阶段。同时也可以分为11个小的阶段,依次为:

 Post-Read-Request,
 URI Translation,
 Header Parsing,
 Access Control,
 Authentication,
 Authorization,
 MIME Type Checking,
 FixUp,
 Response,
 Logging,
 CleanUp

Apache Hook机制

Apache 的Hook机制是指:Apache 允许模块(包括内部模块和外部模块,例如mod_php5.so,mod_perl.so等)将自定义的函数注入到请求处理循环中。换句话说,模块可以在Apache的任何一个处理阶段中挂接(Hook)上自己的处理函数,从而参与Apache的请求处理过程。
 mod_php5.so/ php5apache2.dll就是将所包含的自定义函数,通过Hook机制注入到Apache中,在Apache处理流程的各个阶段负责处理php请求。关于Hook机制在Windows系统开发也经常遇到,在Windows开发既有系统级的钩子,又有应用级的钩子。

以上介绍了apache的加载机制,hook机制,apache的运行过程以及php5模块的相关知识,下面简单的说明在查看源码中的一些常用对象。

Apache常用对象

在说到Apache的常用对象时,我们不得不先说下httpd.h文件。httpd.h文件包含了Apache的所有模块都需要的核心API。它定义了许多系统常量。但是更重要的是它包含了下面一些对象的定义。

request_rec对象 当一个客户端请求到达Apache时,就会创建一个request_rec对象,当Apache处理完一个请求后,与这个请求对应的request_rec对象也会随之被释放。 request_rec对象包括与一个HTTP请求相关的所有数据,并且还包含一些Apache自己要用到的状态和客户端的内部字段。

server_rec对象 server_rec定义了一个逻辑上的WEB服务器。如果有定义虚拟主机,每一个虚拟主机拥有自己的server_rec对象。 server_rec对象在Apache启动时创建,当整个httpd关闭时才会被释放。它包括服务器名称,连接信息,日志信息,针对服务器的配置,事务处理相关信息等 server_rec对象是继request_rec对象之后第二重要的对象。

conn_rec对象 conn_rec对象是TCP连接在Apache的内部实现。它在客户端连接到服务器时创建,在连接断开时释放。
CXSMILES细则-用于在 SMILES 字符串后存储分子的特殊特征 Chemaxon 扩展 SMILES/SMARTS 用于在 SMILES 字符串后存储分子的特殊特征。任何信息都可以存储在 SMILES 字符串后,只要它们由空格或制表符字符分隔,因为 SMILES 解析器会忽略这些信息,或者将它们作为注释使用。扩展特征以以下格式存储:Chemaxon 的扩展 SMILES/SMARTS 不包含非 ASCII 字符,它们通常以字符代码 n 的形式被转义为 &#n;。在 S-group 中,ASCII 字符“,”、“;”、“|”、“{”、“}”也以这种方式转义。此外,符号“$ 阅读详情

相关推荐

AI与运筹学赋能:混合动力公交调度优化算法实战解析

组合优化是运筹学与计算机科学交叉的核心领域,旨在从海量可行方案中寻找最优解,其原理在于通过定义目标函数与约束条件,将复杂现实问题转化为可计算的数学模型。该技术的核心价值在于解决资源受限下的高效分配问题,广泛应用于物流、交通、生产调度等场景。在智慧交通领域,混合动力公交车辆调度正是一个典型的组合优化问题,涉及车辆、班次、充电桩等多重资源与时空约束。本文聚焦于通过贪婪启发式与模拟退火元启发式算法,求解大规模公交网络下的车辆调度与能耗优化方案,旨在实现总能源成本最小化。其中,模拟退火算法通过引入概率性接受劣解的策

weixin_42497762的博客 406

PHP内核-Apache2的SAPI

我们知道定义SAPI之前,首先要定义sapi_module_struct这个结构,相看源码:/soft/php-5.2.9/sapi/apache2handler/sapi_apache2.c,可以看到定义该结构,我直接复制过来: static sapi_module_struct apache2_sapi_module = { "apache2handler",

欣宇的专栏 3071

CANOe实战指南 - 从入门到精通的全流程解析

本文是CANOe实战指南,全面解析从入门到精通的全流程。内容涵盖CANOe软件的核心功能仿真、测试与分析,详细指导安装配置、工程创建、CAN信号收发、UDS诊断通信、CAPL自动化编程以及Panel面板设计。通过实战案例,帮助汽车电子工程师快速掌握这一行业标杆工具,构建自动化测试环境,提升开发与测试效率。

pear55的博客 574

Apache配置PHP模块

打开 httpd.conf 文件 加入以下配置以php模块配置apache2.2.x #BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL by hooyesPHPIniDir "D:/php-5.2.6-Win32/"LoadFile D:/php-5.2.6-Win32/php5ts.dllLoadFile D:/php-5.2.6-Win32/libmysql.dll  LoadFile D:/php-5.2.6-Win32/ntwdblib.dl

Zicheng's tech blog 828

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 439

深入解析Flex NOC总线驱动的实时带宽与延迟优化策略

本文深入解析了Flex NOC总线驱动的核心价值与优化策略。通过解读`/proc/noc/real_time`中的实时带宽与延迟数据,并结合`sysfs`接口进行动态QoS调优,可以有效解决芯片内部数据拥堵问题。文章以智能摄像头和算力盒子的实际案例,详细说明了如何通过优先级调整、带宽限制和参数优化,提升系统在复杂任务下的实时性与稳定性。

weixin_29289821的博客 284

PHP内核之Apache的PHP模块启动

首先,了解一下每个Apache模块都会输出一个模块数据结构,其定义结构如下(以PHP模块为例): AP_MODULE_DECLARE_DATA module php5_module = { STANDARD20_MODULE_STUFF, create_php_config, /* create per-directory config structure */ merge_php_

编程二哥 622

SAP MM自动化进阶:STO交货单自动创建的配置与优化

本文深入解析了SAP MM模块中实现公司间库存调拨订单(STO)交货单自动创建的完整配置流程与优化策略。通过激活自动交货与绑定发货点两大核心配置,打通自动化链路。重点探讨了如何集成ATP可用性检查以智能处理库存不足等异常场景,确保自动化流程的可靠性与业务贴合度,并提供了进阶监控与问题排查方法,助力企业显著提升供应链效率。

weixin_29206669的博客 124

2.PHP7内核剖析 --- SAPI

SAPI 是 PHP 框架的接口层,它是进入 PHP 内部的入口。其中 Cli,Fpm SAPI 是完整的应用程序,它们有定义自己的 main 函数, 方便我们从入口开始逐步调试分析 PHP 的处理,有其是 Cli,非常方便调试。 1.Cli cli 即命令行接口,用于在命令行下执行 php 脚本,就像 shell 那样。 --enable-cli --disable-cli ...

enlyhua的专栏 439

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3161

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1)

其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。

J_Giser的博客 1833

apache是怎么运行php的_PHP与WEB服务器是如何交互的

1.WEB服务器调用PHP接口  以Apache服务器为例,我们看看该服务器是怎样启动PHP,并调用PHP中的方法。Apache服务器启动并运行PHP时,一般是通过mod_php7模块的形式集成(如果是php5.*版本,就是mod_php5模块,模块后缀名根据php版本而定),mod_php7的结构如下(源码路径为php/sapi/apache2handler/mod_php7.c):AP_MOD...

weixin_39761481的博客 588

《基于YOLOv5/8/10的足球比赛球员识别系统毕设全指南:从开发到部署的一站式实战》

本文提出了一个基于YOLO系列模型的足球球员识别系统,具备完整的开发流程和技术方案。系统通过YOLOv5/8/10三大框架实现球员检测,平衡精度与速度需求。开发过程包含数据标注与增强、模型训练调优、PyQt5界面开发等关键环节,并提供了模型轻量化、多任务扩展等优化方向。系统可实现单张图像和视频流的实时识别,支持跨设备部署,适用于赛事分析和训练复盘场景。项目特色在于完整的技术实现路径和对不同YOLO框架的性能对比,为计算机视觉在体育领域的应用提供实践参考。

m0_71589036的博客 216

PHP常说的SAPI是什么

什么是SAPISAPI全称是Server Application Programming Interface,即服务器应用编程接口,实质上就是定义了一个统一的接口,它的核心就是一个结构体sapi_module_struct。SAPI提供给了外部应用跟php通信的管道,这个外部应用包括不限于Apache,httpd,liunx终端等,sapi通俗的讲就是php-cgi,php-cli,mod_php...

前行的博客 5018

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述

第二节:SAPI概述简介: 一些与服务相关的操作都是通过SAPI接口实现。 这些内置实现的物理位置在PHP源码的SAPI目录。 这个目录存放了PHP对各个服务器抽象层的代码,例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等。 在各个服务器抽象层抽象层遵守着相同的约定,这里我们称之为SAPI接口。每个SAPI实现都是一个__sapi_mo

景山编程-顺道编程 668

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PHP中的SAPI是什么,都有那些模式?

SAPI 即 Server API ,是应用程序与外部程序的通讯协议。 在PHP源码的sapi目录下就是当前版本提供的SAPI列表: apache2handler cgi embed cli litespeed phpdbg 编译后你就会看到php, php-cgi, php-fpm三个可执行程序。 如果是在win环境下会看到php.exe, php-cgi.exe文件。 php 在cli模式下运行的程序,用来解释运行PHP代码。 php-cgi 实现了fastcgi协议的程序。当你使用phpstudy

猛犸象 1597

深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述

第二节:SAPI概述 _________________________________________________________________________________________________ 简介: 一些与服务相关的操作都是通过SAPI接口实现。 这些内置实现...

cicongchu5275的博客 286

七、PHP内核探索:再次探讨SAPI ☞ 很多操作都是通过SAPI接口实现

在PHP的生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。 这些内置实现的物理位置在PHP源码的SAPI目录。这个目录存放了PHP对各个服务器抽象层的代码, 例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等。 在各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口。 每个SAPI实现都是一个_sapi_module_struct...

进阶之旅 382

PHP内核之SAPI:Apache2 SAPI分析

1、首先概念普及: SAPI: Server abstraction API,它提供了一个接口,使得PHP可以和其他应用进行交互数据,具体点说是提供了一个和外部通信的接口。常见的:给apache的mod_php5,CGI,给IIS的ISAPI,还有Shell的CLI 首先我们看个从鸟哥那挪来的PHP架构图: 如果还感觉概念模糊的话 可以试着用wamp升级php版本来找下感觉 首先说

编程二哥 1964

[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述-Apache模块-FastCGI

Apache 模块apache 是 Apache软件基金会的一个开发源代码的web服务器,可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,最流行的Web服务器端软件之一。Apache支持许多特性,大部分通过模块扩展实现。场景的模块包括 mod_auth(权限验证)、mod_ssl(SSL和TLS支持) mod_rewirte(URL重写)等。当PHP需要在Apache服务器下运行时,

景山编程-顺道编程 493

apache启动php模块,APache的PHP模块启动

首先,了解一下每个Apache模块都会输出一个模块数据结构,其定义结构如下(以PHP模块为例):AP_MODULE_DECLARE_DATA module php5_module = {STANDARD20_MODULE_STUFF,create_php_config, /* create per-directory config structure */merge_ph...

weixin_33536190的博客 376

深入理解PHP原理之PHP与WEB服务器交互

我们都知道,PHP需要在具体的WEB服务器中才能运行,例如Nginx、Apache等,但是PHP是怎样启动,又是怎样在服务器中运行,然后两者又是怎样进行交互的呢?    1. WEB服务器调用PHP接口   以Apache服务器为例,我们看看该服务器是怎样启动PHP,并调用PHP中的函数。Apache服务器启动并运行PHP时,一般是通过mod_php7模块的形式集成(如果是php5.*版本,就

飞楼踏梦 8436

[PHP] PHP服务器接口SAPI中的结构体

SAPI:在各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口。例如命令行程序的实现,Apache的mod_php模块实现以及fastcgi的实现等等 1.结构体:使用结构体(Struct)来存放一组不同类型的数据struct 结构体名{ 结构体所包含的变量或数组};struct 结构体名 结构体变量名 2.成员的获取和赋值结构体变量名.成员名; 3.结构体指针...

程序员老狼专注开发aigc或客服系统应用 137

到底为什么PHP 与外部 Web 服务器(如 Apache/Nginx)的通信桥梁要用SAPI?

SAPI 是 PHP 与不同外部运行环境(Web 服务器或命令行)交互的“适配层”,没有它,PHP 根本无法从 Web Server 接收请求,也无法正确响应浏览器。

长风破浪会有时的博客 518

php提供的sapi有哪些?CGI、FastCGI、php-fpm、php-cgi解释

一、前言 一直对PHP的sapi是什么东西好奇,在网上一查都是各种说fpm cgi fastcgi php-cgi 直到看了鸟哥的这篇文章介绍戳这里,看到源码下的sapi目录才有所了解。 二、sapi是什么 了解下PHP的架构体系会知道sapi是PHP提供的一种供其他程序调用的接口(感觉接口这词好像不太准确,欢迎纠正),通过sapi其他程序就可以执行PHP脚本。 具体提供的sapi有: ...

dejiushu5831的博客 213

php内核源码解析=SAPI层——PHP怎么嵌入到各种Server中

作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主。

qq_37805832的博客 603

深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述-Apache模块-FastCGI

Apache 模块 __________________________________________________________ apache 是 Apache软件基金会的一个开发源代码的web服务器,可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,最流行的Web服...

cicongchu5275的博客 194
上一篇: php源码之路第二章第一节(生命周期和zend引擎)
下一篇: 【Day26】include require include_once require_once 的区别深度总结
Leslie丶
博客等级 码龄11年 51粉丝 104原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值