iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP自定义扩展之生命周期的示例分析
  • 798
分享到

PHP自定义扩展之生命周期的示例分析

2023-06-22 04:06:00 798人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关PHP自定义扩展之生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php_request_startup这个阶段和php_module_startup差不多,都

这篇文章将为大家详细讲解有关PHP自定义扩展之生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

php_request_startup

这个阶段和php_module_startup差不多,都是初始化工作,比php_module_startup简单很多,可以自己看下,重点来看下执行阶段

php_execute_script

用gdb看看调用栈,gdb ./php  

php_execute_script打断点,执行,在看下调用栈,

b php_execute_script(gdb) r test.phpbt#0  php_execute_script (primary_file=0x7fffffffe240)    at /www/test/php/php-7.4.3/main/main.c:2541#1  0x00000000008bbd85 in do_cli (arGC=2, argv=0x1425af0)    at /www/test/php/php-7.4.3/sapi/cli/php_cli.c:961#2  0x00000000008bcd2d in main (argc=2, argv=0x1425af0)    at /www/test/php/php-7.4.3/sapi/cli/php_cli.c:1356

在调用栈可以清楚看到执行流程,现在到/cli/php_cli.c文件看看做了哪些事情,

int c;    zend_file_handle file_handle;    int behavior = PHP_MODE_STANDARD;    char *reflection_what = NULL;    volatile int request_started = 0;    volatile int exit_status = 0;    char *php_optarg = NULL, *orig_optarg = NULL;    int php_optind = 1, orig_optind = 1;    char *exec_direct=NULL, *exec_run=NULL, *exec_begin=NULL, *exec_end=NULL;    char *arg_free=NULL, **arg_excp=&arg_free;    char *script_file=NULL, *translated_path = NULL;    int interactive=0;    int lineno = 0;    const char *param_error=NULL;    int hide_argv = 0;    zend_try {        CG(in_compilation) = 0;         while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) {            switch (c) {

初始化变量,解析命令到/main/main.c文件看看真正的执行阶段

PHPAPI int php_execute_script(zend_file_handle *primary_file){    zend_file_handle *prepend_file_p, *append_file_p;    zend_file_handle prepend_file = {{0}, NULL, NULL, 0, 0}, append_file = {{0}, NULL, NULL, 0, 0};#if HAVE_BROKEN_GETCWD    volatile int old_cwd_fd = -1;#else    char *old_cwd;    ALLOCA_FLAG(use_heap)#endif    int retval = 0;

加载要执行的php文件,通过zend_compile_file进行词法分析 语法分析,生成AST,编译成op_array,也就是指令集,
我们看下指令集,

b zend_executecbt(gdb) p *op_array$1 = {type = 2 '\002', arg_flags = "\000\000", fn_flags = 37748736,   function_name = 0x0, scope = 0x0, prototype = 0x0, num_args = 0,   required_num_args = 0, arg_info = 0x0, cache_size = 16, last_var = 2,   T = 4, last = 13, opcodes = 0x7ffff5e8b000, run_time_cache__ptr = 0x0,   static_variables_ptr__ptr = 0x7ffff5e78358, static_variables = 0x0,   vars = 0x7ffff5e790f0, refcount = 0x7ffff5e85000, last_live_range = 0,   last_try_catch = 0, live_range = 0x0, try_catch_array = 0x0,   filename = 0x7ffff5e583c0, line_start = 1, line_end = 12,   doc_comment = 0x0, last_literal = 5, literals = 0x7ffff5e8b1a0,   reserved = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}

然后放到zend虚拟机上执行zend_execute(op_array, retval);这这里可以看到真正执行的是这个zend_execute_ex(execute_data);,它是一个函数指针,我们可以更换它,知道这个,那么我们在写扩展时可以重新写个zend_execute_ex函数替换php默认的,我们自己的就可以做很多事情,像拦截php函数,做性能监控

请求关闭阶段php_request_shutdown,模块关闭阶段php_module_shutdown这两个阶段主要是做变量销毁,现在我们知道了一个自定义扩展在生命周期里的怎么执行的。

关于“PHP自定义扩展之生命周期的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: PHP自定义扩展之生命周期的示例分析

本文链接: https://www.lsjlt.com/news/302324.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP自定义扩展之生命周期的示例分析
    这篇文章将为大家详细讲解有关PHP自定义扩展之生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php_request_startup这个阶段和php_module_startup差不多,都...
    99+
    2023-06-22
  • vue生命周期的示例分析
    这篇文章主要介绍了vue生命周期的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue生命周期图解感谢你能够认真阅读完这篇文章,希望小编分享的“vue生命周期的示例分...
    99+
    2023-06-14
  • Vue2.0生命周期的示例分析
    这篇文章主要为大家展示了“Vue2.0生命周期的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue2.0生命周期的示例分析”这篇文章吧。网上已经有很多...
    99+
    2024-04-02
  • Spring自定义XML schema 扩展的示例分析
    小编给大家分享一下Spring自定义XML schema 扩展的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring整合dubbo的事例<be...
    99+
    2023-06-15
  • Java之SpringBean生命周期问题的示例分析
    小编给大家分享一下Java之SpringBean生命周期问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Bean的生命周期?首先说一下S...
    99+
    2023-06-20
  • Vue中生命周期的示例分析
    这篇文章将为大家详细讲解有关Vue中生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最简单的Vue 实例//html <div id=&q...
    99+
    2024-04-02
  • React中生命周期的示例分析
    这篇文章将为大家详细讲解有关React中生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React的生命周期两张图带你理解 React的生命周期React的生命周期(旧)class&nbs...
    99+
    2023-06-20
  • Java之Bean的生命周期实例分析
    本篇内容主要讲解“Java之Bean的生命周期实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java之Bean的生命周期实例分析”吧!一、什么是生命周期首先理解下什么是生命周期从创建到消...
    99+
    2023-07-02
  • docker中pod生命周期的示例分析
    这篇文章给大家分享的是有关docker中pod生命周期的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 查看资源配置清单帮助  [root@master manifests]...
    99+
    2023-06-04
  • Rust语言生命周期的示例分析
    本篇文章为大家展示了Rust语言生命周期的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Rust 官方博客发布了 2020 年度的 Rust 调查报告。此次...
    99+
    2024-04-02
  • 基于Vue生命周期的示例分析
    这篇文章主要介绍基于Vue生命周期的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言Vue实例在创建时有一系列的初始化步骤,例如建立数据观察,编译模板,创建数据绑定等。在此...
    99+
    2024-04-02
  • angular4生命周期钩子的示例分析
    这篇文章主要介绍angular4生命周期钩子的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!理解Angular提供了生命周期钩子,把这些关键生命时刻暴露出来,赋予我们在它们发...
    99+
    2024-04-02
  • Spring配置使用之Bean生命周期的示例分析
    这篇文章主要介绍了Spring配置使用之Bean生命周期的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本概念Spring 中的 Bean 的生命周期,指的是 Be...
    99+
    2023-05-31
    spring bean
  • Vue中生命周期过程的示例分析
    这篇文章主要介绍Vue中生命周期过程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Vue 提供了11个钩子函数1,从创建到销毁发生的一系列状态叫做什么周期,在这个过程中vu...
    99+
    2024-04-02
  • Spring bean生命周期验证的示例分析
    这篇文章主要为大家展示了“Spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。一、从源码注释看be...
    99+
    2023-05-30
    spring bean
  • Laravel的生命周期实例分析
    本篇内容主要讲解“Laravel的生命周期实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel的生命周期实例分析”吧!Laravel的生命周期 A世间万物皆有生命周期,当我们使用...
    99+
    2023-06-30
  • React的生命周期实例分析
    这篇文章主要讲解了“React的生命周期实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React的生命周期实例分析”吧!一、React生命周期React 生命周期分为三种状态 初始化...
    99+
    2023-07-02
  • Vue组件和Route生命周期的示例分析
    这篇文章主要为大家展示了“Vue组件和Route生命周期的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue组件和Route生命周期的示例分析”这篇文...
    99+
    2024-04-02
  • Java Spring Bean生命周期管理的示例分析
    小编给大家分享一下Java Spring Bean生命周期管理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Spring Bean的生命周期管理一、Spring Bean的生命周期通过以下方式...
    99+
    2023-06-22
  • Vue.js1.x和2.x生命周期的示例分析
    这篇文章给大家分享的是有关Vue.js1.x和2.x生命周期的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Vue.js中,在实例化Vue之前,它们都是以HTML的文本...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作