热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php的扩展和嵌入--php的生命周期与变量详述_PHP教程-php教程

php的扩展和嵌入--php的生命周期与变量详述。首先开始介绍php的生命周期,了解一个php程序从开始运行到最后结束究竟经过怎么样的过程,对学习php和平时php开发应该是很重要的。起始
首先开始介绍php的生命周期,了解一个php程序从开始运行到最后结束究竟经过怎么样的过程,对学习php和平时php开发应该是很重要的。

起始和关闭阶段:
  • 对于php的起始和关闭阶段可以分成两层,
    • 第一层是php解释器作为一个整体进行结构和值的初始化过程。
    • 第二层则是在每一个页面的请求过程中。
    • 对于每个扩展而言,都会有一个初始化MINT函数,这个过程会声明变量、类,注册资源、流和过滤处理器,这些操作在所有的请求中都是存在的,所以可以称为是Persistent的。一般进行如下的两步操作:
      • REGISTER_INI_ENTRIES()
      • 初始化模块的全局变量
      • 而在页面发出请求了之后,PHP则会建立一个包括符号表和配置值在内的操作环境,然后这次php解释器会再次循环每一个扩展,调用每个扩展的RINIT初始化函数。一般RINT函数的操作如下:
        • 把globalvalue设成默认值,这些全局变量往往是每个请求都需要的,但是针对每一个请求而言都是相互独立的。
        • 那些需要用到的变量需要放到符号表中以备调用。
        • 在这个函数中还可以记录一下请求的相关信息
        • 完成了请求的处理之后,如果到达了脚本尾部或通过die() exit()推出了,那么php通过调用RSHUTDOWN()开始清理
          • 这时候每个符号表中的变量都会被unset掉
          • 而当所有的请求都被满足了之后,就开始针对于模块的MSHUTDOWN过程
            • 调用UNREGISTER_INI_ENTRYES(),与MINIT函数的初始化过程相互对应。 php程序执行的生命周期:
              要了解生命周期,就必须对不同的执行方式有所涉及。php可以有几种不同的执行方式,每种方式都有其特定的生命周期。
              • CLI:这个是从命令行执行php程序,它的生命周期最为简单。比如在执行test.php的时候,就经历了如下的过程
              • \
              • 图1 CLI进行php执行的过程
              • 注意到MINIT RINIT RSHUTDOWN MSHUTDOWN都只被调用过一次,这个比较类似于瀑布式的结构。
              • 多线程的模块方式:这是最常用的一种方式,php作为APXS的模块对apache进行配合。在apache启动的时候会fork很多的子进程。针对于多个不同的请求,配合的是多个不同的初始化与结束过程。但是对每一个线程来说,只有一个MINIT和MSHUTDOWN的调用。而每个请求都对应着自己单独的RINIT和RSHUTDOWN。
              • 多线程的模块方式:采用多线程的方法可以避免不同的线程重复的调用MINIT/MSHUTDOWN.它具有的好处是多个请求可以共享信息,但是请求之间的隔离要求比较高,不然容易出现变量的访问出错。

                Zend 线程安全
                php对线程安全的处理有专门的机制,称为Thread Safe Resource Management(TSRM)。在进行线程安全和非线程安全声明的时候,明显有一些不同之处:
                • 线程安全的变量声明:
                • typedef struct {
                  int sampleint;
                  char *samplestring;
                  } php_sample_globals;
                  int sample_globals_id;
                  PHP_MINIT_FUNCTION(sample)
                  {
                  ts_allocate_id(&sample_globals_id,
                  sizeof(php_sample_globals),
                  (ts_allocate_ctor) php_sample_globals_ctor,
                  (ts_allocate_dtor) php_sample_globals_dtor);
                  return SUCCESS;
                  }
                  • 从这段代码中可以看到,在MINIT阶段,需要通过ts_allocate_id函数来通知TSRM这个程序需要多少空间,TSRM会增加当前的空间消耗,并返回一个id指向线程数据池的相应部分。
                  • 而当请求要访问数据的时候,就首先从TSRM层找到当前线程的资源池的指针,然后加上ts_allocate_id()返回的资源id作为offset。
                  • 非线程安全的变量声明:
                  • typedef struct {
                    int sampleint;
                    char *samplestring;
                    } php_sample_globals;
                    php_sample_globals sample_globals;
                    PHP_MINIT_FUNCTION(sample)
                    {
                    php_sample_globals_ctor(&sample_globals TSRMLS_CC);
                    return SUCCESS;
                    }
                    • 在非线程安全的情况下,只需要简单的声明变量,更加快速有效,数据的地址在编译阶段就可以确定,而不是像在线程安全的情况下需要运行时计算。同时它还有一个好处就是一段程序出了bug不会让整个webserver坏掉。因此在不需要用到线程安全的时候,还是应该尽量使用非线程安全声明方式。
                    • 为了构建线程安全的php,必须在编译的时候加上--enable-maintainer-zts选项。而在程序中检测的时候可以用#ifdef ZTS,通过这种检测可以实现对全局变量声明的不同处理,入下例所示:
                    • #ifdef ZTS
                      #define HELLO_G(v) TSRMG(hello_globals_id, zend_hello_globals *, v)
                      #else
                      #define HELLO_G(v) (hello_globals.v)
                      #endif

                      • 通过判断是否启动了线程安全,对变量进行了不同的声明和访问方式指定。
                      • 在启用了线程安全之后,为了在不同的线程之间对数据进行区分,PHP会自动启用一个tsrm_ls指针。在这个指针的帮助下,各个线程的函数才能找到对应的符号表进行相应的变量读取操作。也正是这种机制使得多个线程一起工作的时候,数据空间不会乱掉。

                        通过对php的起始和结束阶段、生命周期和Zend线程安全的机制的了解,有利于后续对php扩展编译的研究。

                        www.bkjia.comtruehttp://www.bkjia.com/PHPjc/621631.htmlTechArticle首先开始介绍php的生命周期,了解一个php程序从开始运行到最后结束究竟经过怎么样的过程,对学习php和平时php开发应该是很重要的。 起始...


推荐阅读
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文探讨了当通过Nginx访问网站时出现504 Gateway Timeout错误的解决方案,特别是当请求处理时间超过30秒时的情况。文章提供了调整PHP-FPM配置的具体步骤,以延长请求超时时间。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 最适合初学者的编程语言
    本文探讨了适合编程新手的最佳语言选择,包括Python、JavaScript等易于上手且功能强大的语言,以及如何通过有效的学习方法提高编程技能。 ... [详细]
  • HBase 数据复制与灾备同步策略
    本文探讨了HBase在企业级应用中的数据复制与灾备同步解决方案,包括存量数据迁移及增量数据实时同步的方法。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
author-avatar
maggieting0334_990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有