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

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • 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域名重定向代码利用301永久重定向来高速搜索引擎,我的网站内容搬家了php代码里隐藏域名
  • 网站后台管理系统php【开源精选】后台管理UI基于最新版本的第三方插件php中网站不同模板后台逻辑代码怎么管理
  • PHP开发网站技术知识分享全过程(一)_
  • php语言视频教程2015腾云网络开发者大会在北京朗丽兹西山花园酒店隆重召开后盾网原创视频,微博项目开发视频教程(php实战)
  • 图形只需很少的培训,即可由控制工程师和工厂技术人员使用OOIP
  • 360 php防注入代码绕过思路利用函数正则匹配导致拦截绕过姿势(组图) php mysql pdo 防注入
  • PHP7对阵HHVM会有怎样的新能变化
  • PHP配置文件中代码位置如下:检查WEB根目录是否搭建成功
  • norepad++如何编写php代码名为PHP的iPad应用不但赋予iPad写代码的能力,能让它离线运行PHP代码php精粹:编写高效php代码
  • 应用程序的功能,HTML仍然是唯一的标记语言?

相关

PHP IDEs与PHP CLI工具:助力高效PHP开发,满

PHP IDEs与PHP CLI工具:助力高效PHP开发,满

什么是PHP?其优势有简单易学、安全性高、开发效率高及社区活

什么是PHP?其优势有简单易学、安全性高、开发效率高及社区活

深入学习PHP编程基础与高级技术,掌握数字时代开发技能

PHP中七个常用框架介绍,详细解读ThinkPHP及其他框架

Science Technology:PHP开发平台发展历程

Science Technology:PHP开发平台发展历程

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

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

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

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

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

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

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

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

标签

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

  • 微信

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