宿迁腾云网络网站建设公司

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们
首页 > 行业动态 > 技术日志 > 看看该服务器是怎样启动PHP,并运行PHP中的方法

看看该服务器是怎样启动PHP,并运行PHP中的方法

2021-08-17

1.WEB服务器调用PHP接口

以服务端为例,看看服务端是如何启动PHP并调用PHP中的方法的。服务器启动运行PHP时,一般以模块的形式集成(如果是php5.*版本,则是模块,模块的后缀取决于php版本)。结构如下(源码路径为php/sapi//.c):

AP_MODULE_DECLARE_DATA module php7_module = {
    STANDARD20_MODULE_STUFF,/* 宏,包括版本,版本,模块索引,模块名,下个模块指针等信息 */
    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   /* register hooks */
};

当你需要在 PHP 中调用一个方法时,你只需要通过模块将请求传达给 PHP。 PHP层处理完数据后,返回数据,整个过程就结束了。 (另外:服务器启动PHP的时候,其实有两种加载方式,一种是静态加载,一种是动态加载。刚才讨论的模块加载方式可以理解为静态加载,即服务端需要重新启动加载PHP;

动态加载不需要重启服务器。只需通过发送信号将固定的PHP模块加载到服务器即可达到PHP启动的目的。但是在动态加载之前,需要将加载模块编译成动态链接库。然后将其配置到服务器配置文件中)。上面已经给出了PHP中的结构,下面给出了服务器端对应的结构,如下(中间是源码,下同):

struct module_struct {
    int version;
    int minor_version;
    int module_index;
    const char *name;
    void *dynamic_load_handle;
    struct module_struct *next;
    unsigned long magic;
    void (*rewrite_args) (process_rec *process);
    void *(*create_dir_config) (apr_pool_t *p, char *dir);
    void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
    void *(*create_server_config) (apr_pool_t *p, server_rec *s);
    void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf);
    const command_rec *cmds;
    void (*register_hooks) (apr_pool_t *p);
}

可以看出and还是有很大区别的,但是如果你看到.UFF宏的定义,你可能会觉得这两个结构很相似。其实这个宏定义了前8个参数,定义如下:

#define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, 
    MODULE_MAGIC_NUMBER_MINOR, 
    -1, 
    __FILE__, 
    NULL, 
    NULL, 
    MODULE_MAGIC_COOKIE, 
    NULL /* rewrite args spot */

那么。定义了模块的所有指令集php获取apache版本,具体定义内容如下(代码路径为php/sapi//.c):

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}
};

也就是说PHP层只提供了以上5条指令,每条指令的源码也在.c文件中。最后是.k,其定义如下(代码路径为php/sapi //.c):

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);
#ifdef ZEND_SIGNALS
    ap_hook_child_init(zend_signal_init, NULL, NULL, APR_HOOK_MIDDLE);
#endif
    ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);
}

.k 函数包含 4 个钩子和相应的处理函数,是启动钩子。它们在服务器启动时被调用。钩子是一个请求钩子。在发出服务器请求时调用它。通过这些钩子,你可以通过服务器启动PHP。

我会来的。我想你已经知道WEB服务器如何启动PHP并调用PHP中的方法了。下面我就给大家讲讲PHP是如何调用WEB服务器接口的。

2.PHP 调用WEB服务器接口 在我们讲这个问题之前,我们需要了解什么是SAPI。 SAPI 实际上是与服务器抽象层观察到的通用协议。很容易理解,当PHP需要调用服务端的某个方法时,比如清除缓存,清除缓存的实现方法是在服务端实现的,PHP层根本不知道。服务端的方法怎么调用,怎么做?

这时候需要双方做一个约定,然后服务器向PHP提供一套约定好的接口。我们将这些与服务器抽象层的通用协议称为 SAPI 接口。

问题来了。对于服务器php获取apache版本,我们可以提供一套SAPI,但是如果下次有其他服务器或其他“第三方”来,我们是否还需要为它们提供单独的SAPI?毛布?

我们聪明的PHP开发者一定想到了这个,就是为所有“第三方”提供一套通用的SAPI接口,但是你可能会问,如果新的“第三方”需要这些接口,你的通用SAPI不支持,怎么办?我的理解是,在 PHP 的通用 SAPI 接口中添加新功能只是个人意见。一般的SAPI结构如下(源码路径:php/main/SAPI.h):

struct _sapi_module_struct {
    char *name;         // 名字
    char *pretty_name;  // 更好理解的名字
    int (*startup)(struct _sapi_module_struct *sapi_module);    // 启动函数
    int (*shutdown)(struct _sapi_module_struct *sapi_module);   // 关闭函数
    int (*activate)(TSRMLS_D);           // 激活
    int (*deactivate)(TSRMLS_D);         // 停用
    void (*flush)(void *server_context); // flush
    char *(*read_cookies)(TSRMLS_D);     //read Cookies
    //...
};

这个结构的变量很多,就不一一列举了。我简单解释一下里面的变量:SAPI初始化时调用的函数,该函数用于释放SAPI的数据结构和内存。它在 SAPI 中激活。调用时,则将该函数得到的值赋给SG()。

那么对于PHP提供的通用SAPI,服务端如何自定义自己的接口呢?具体结构如下(源码路径为php/sapi//.c):

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
};

在上述源码目录php/sapi//中,php/sapi目录放在通过SAPI调用的“第三方”下。目录结构如下图所示,目录php/sapi/都是与PHP交互的接口,.c是PHP与约定的SAPI之间的接口文件。

看到这里,大家应该对PHP层如何调用服务层接口有了基本的了解。为了巩固以上知识,下面来个栗子,即在服务器环境下阅读:

SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);

对于任何一个在加载的时候,我们都会指定它的方法是一个函数,这样就实现了PHP层调用的接口。是不是很简单?

进阶阶段总会有一些问题和瓶颈。写太多业务代码没有方向感。我不知道从哪里开始改进。我整理了一些这方面的资料,包括但不限于:分布式架构、高扩展性、高性能、高并发、服务器性能调优、TP6、YII2、、、、、优化、脚本、微服务等进阶知识点都可以与您免费分享。需要点这里

最后,祝你在面试中一切顺利,得到你最喜欢的。如果你想和一群3-8年的资深开发者交流学习,你需要

请点击这里 .im

Tag: php 编程语言
网站制作公众号

宿迁腾云网络网站建设公司 | 网站开发 | 网站制作 | 网站优化

咨询电话:13160355545

上一篇

返回栏目

下一篇

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

热推

  • php网络公司网站源码如何利用PHP直播平台源码的直播电商业务是关键?php网站源码 下载
  • 论坛php网站模板 会员整合使用插件实现与论坛的无缝整合(图) php论坛模板
  • php 网站支付宝接口 支付宝小程序开放营销反作弊接口减少营销损失、提升营销投入产出比php支付宝接口操作教程
  • 几款现阶段流行的框架组合,你知道几个?(上)
  • php语言培训学校如何选择一家靠谱的培训机构?-学PHP需不需要报培训班asp语言改php
  • php开发实战慕课网“成长▪夏日大作战”活动正式上线php web 20开发实战
  • 大型网站架构的技术要点与应用层的组织方式分析
  • 一致性hash算法php开源分布式分布式会遇到什么问题,如何设计一个高质量的分布式系统一致性hash算法php开源
  • php 开源轻博客系统学习的原因百度百科优缺点介绍下载5.4.4建站的原因php个人博客开源程序
  • php网络公司网站源码定制一款棋牌游戏,要考虑到方方面面的问题,并没有 php 公司网站源码

相关

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

如何查看php版本?多种方法助你快速知晓

如何查看php版本?多种方法助你快速知晓

PHP格式化:提升代码质量与协作效率的关键规则

如何查看虚拟主机上的 PHP 版本?这篇文章告诉你

Linux 系统管理员和 web 开发者必知:如何查看 PH

Linux 系统管理员和 web 开发者必知:如何查看 PH

免费开源的轻量级 PHP 开发框架 ThinkPHP,遵循

从零开始开发完整网站:前端、后端与 Web 服务器的关键技术

php框架 Java 与 PHP 之争:为何懂技术的大佬选

BitDefender 发布超级工厂病毒专杀工具,可清除所有

asp语言与php语言的区别 前端和后端的区别,你真的了解吗

标签

seo(1182) 市场营销(661) 网站制作(573) 网站建设(564) 搜索引擎(553) 网站(482) PHP(361) 编程语言(345) 建站(294) 关键词排名优化(267) 网站建设公司(245) 优化(216) seo排名(207) 域名(190) 软件(171) 网站优化(148) 搜索引擎优化(146) 外链(141) 科技(136) 网站关键词(124) 网站排名优化(123) 域名服务器(120) 网站排名(107) 时政(103) 排名优化(95) 搜索引擎收录(93) 网站设计(92) 电子商务(88) 引擎(86) 移动互联网(85) 开发框架(79) 开发(75) 网站服务器(74) 框架(68) 前端开发(68) 网站分析(66) 网站建设方案(65) 关键(64) 流量(63) 源码(62) 百度优化(62) 网站权重(61) 开放源代码(59) seo培训(53) 网页设计(51) 百度(51) php框架(50) 网站建设知识(50) 大数据(50) 谷歌(49)
宿迁腾云网络网站建设公司
网站建设
  • 私人定制
  • 标准模板建站
  • 经济模板建站
精品模板

宿迁腾云网络网站建设公司

联系电话:13160355545

公司地址:江苏省宿迁市丽景湾华庭北门都市花园公寓9楼907

联系邮箱:admin@tyweb.net

全国分站
  • 北京
  • 广东
  • 东莞 广州 中山 深圳 惠州 江门 珠海 汕头 佛山 湛江 河源 肇庆 潮州 清远 韶关 揭阳 阳江 云浮 茂名 梅州 汕尾
  • 山东
  • 济南 青岛 临沂 济宁 菏泽 烟台 泰安 淄博 潍坊 日照 威海 滨州 东营 聊城 德州 莱芜 枣庄
  • 江苏
  • 苏州 徐州 盐城 无锡 南京 南通 连云港 常州 扬州 镇江 淮安 泰州 宿迁
  • 河南
  • 郑州 南阳 新乡 安阳 洛阳 信阳 平顶山 周口 商丘 开封 焦作 驻马店 濮阳 三门峡 漯河 许昌 鹤壁 济源
  • 上海
  • 河北
  • 石家庄 唐山 保定 邯郸 邢台 沧州 秦皇岛 张家口 衡水 廊坊 承德
  • 浙江
  • 温州 宁波 杭州 台州 嘉兴 金华 湖州 绍兴 舟山 丽水 衢州
  • 陕西
  • 西安 咸阳 宝鸡 汉中 渭南 安康 榆林 商洛 延安 铜川
  • 湖南
  • 长沙 邵阳 常德 衡阳 株洲 湘潭 永州 岳阳 怀化 郴州 娄底 益阳 张家界 湘西
  • 重庆
  • 福建
  • 漳州 泉州 厦门 福州 莆田 宁德 三明 南平 龙岩
  • 天津
  • 云南
  • 昆明 红河 大理 文山 德宏 曲靖 昭通 楚雄 保山 玉溪 丽江 临沧 思茅 西双版纳 怒江 迪庆
  • 四川
  • 成都 绵阳 广元 达州 南充 德阳 广安 阿坝 巴中 遂宁 内江 凉山 攀枝花 乐山 自贡 泸州 雅安 宜宾 资阳 眉山 甘孜
  • 广西
  • 贵港 玉林 北海 南宁 柳州 桂林 梧州 钦州 来宾 河池 百色 贺州 崇左 防城港
  • 安徽
  • 芜湖 合肥 六安 宿州 阜阳 安庆 马鞍山 蚌埠 淮北 淮南 宣城 黄山 铜陵 亳州 池州 巢湖 滁州
  • 海南
  • 三亚 海口 琼海 文昌 东方
  • 江西
  • 南昌 赣州 上饶 吉安 九江 新余 抚州 宜春 景德镇 萍乡 鹰潭
  • 湖北
  • 武汉 宜昌 襄樊 荆州 恩施 孝感 黄冈 十堰 咸宁 黄石 仙桃 随州 天门 荆门 潜江 鄂州 神农架
  • 山西
  • 太原 大同 运城 长治 晋城 忻州 临汾 吕梁 晋中 阳泉 朔州
  • 辽宁
  • 大连 沈阳 丹东 辽阳 葫芦岛 锦州 朝阳 营口 鞍山 抚顺 阜新 本溪 盘锦 铁岭
  • 黑龙江
  • 齐齐哈尔 哈尔滨 大庆 佳木斯 双鸭山 牡丹江 鸡西 黑河 绥化 鹤岗 伊春 大兴安岭 七台河
  • 内蒙古
  • 赤峰 包头 通辽 呼和浩特 乌海 鄂尔多斯 呼伦贝尔
  • 贵州
  • 贵阳 黔东 黔南 遵义 黔西 毕节 铜仁 安顺 六盘水
  • 甘肃
  • 兰州 天水 庆阳 武威 酒泉 张掖 陇南 白银 定西 平凉 嘉峪关 临夏 金昌 甘南
  • 青海
  • 西宁 海西 海东 海北 果洛 玉树 黄南
  • 新疆
  • 乌鲁木齐 伊犁 昌吉 石河子 哈密
  • 西藏
  • 拉萨 山南 林芝 日喀则
  • 吉林
  • 长春 白山 白城 延边 松原 辽源 通化 四平
  • 宁夏
  • 银川 吴忠 中卫 石嘴山 固原
SiteMap
网站地图
TAG标签
Copyright © 2017-2025 TYWEB.NET 宿迁腾云网络科技有限公司 ALL RIGHTS RESERVED.   苏ICP备17033535号-1

热门搜索

百度 下载 2025 2024 2026 货源 货货源 虚拟 禅道 报名 金蝶KIS旗舰版
  • 客服

    在线客服

  • 电话

    13160355545

  • 微信

精品模板
建站费用
成功案例
联系我们