文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP自定义扩展的钩子功能是什么

2023-06-22 03:33

关注

本篇内容主要讲解“PHP自定义扩展的钩子功能是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP自定义扩展的钩子功能是什么”吧!

php_module_startup

先看看这个阶段做了什么,如果不知道php入口文件在哪,用gdb看看调用栈,gdb ./php
php_module_startup打断点,执行,在看下调用栈,

b php_module_startup(gdb) r test.phpbtphp_module_startup (sf=0x1406460 <cli_sapi_module>,     additional_modules=0x0, num_additional_modules=0)    at /www/test/php/php-7.4.3/main/main.c:2098#1  0x00000000008bae7c in php_cli_startup (    sapi_module=0x1406460 <cli_sapi_module>)    at /www/test/php/php-7.4.3/sapi/cli/php_cli.c:407#2  0x00000000008bcc80 in main (argc=2, argv=0x1425af0)    at /www/test/php/php-7.4.3/sapi/cli/php_cli.c:1323

在调用栈可以清楚看到执行流程,现在到/main/main.c文件看看做了哪些事情,也可以用gdb一步一步的看,这里就讲与php扩展有关的几个地方,这里做的初始化工作,像垃圾回收,请求初始化,注册常量,php.ini配置文件加载等,

先来看看怎么加载模块的

    if (php_register_internal_extensions_func() == FAILURE) {        php_printf("Unable to start builtin modules\n");        return FAILURE;    }

这里是加载php内置的模块,这里只贴出核心功能,先检查依赖

    if (module->deps) {        const zend_module_dep *dep = module->deps;        while (dep->name) {            if (dep->type == MODULE_DEP_CONFLICTS) {                name_len = strlen(dep->name);                lcname = zend_string_alloc(name_len, 0);                zend_str_tolower_copy(ZSTR_VAL(lcname), dep->name, name_len);                if (zend_hash_exists(&module_registry, lcname) || zend_get_extension(dep->name)) {                    zend_string_efree(lcname);                                        zend_error(E_CORE_WARNING, "Cannot load module '%s' because conflicting module '%s' is already loaded", module->name, dep->name);                    return NULL;                }                zend_string_efree(lcname);            }            ++dep;        }    }
if (module->functions && zend_register_functions(NULL, module->functions, NULL, module->type)==FAILURE) {        zend_hash_del(&module_registry, lcname);        zend_string_release(lcname);        EG(current_module) = NULL;        zend_error(E_CORE_WARNING,"%s: Unable to register functions, unable to load", module->name);        return NULL;    }

这是内置模块加载原理,现在看看ini里的扩展怎么加载

php_ini_register_extensions();
zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb);

利用这个函数加载

php_load_extension(char *filename, int type, int start_now)

这里面也执行了加载内置模块的功能。

是调用了module->functions,进行模块功能函数注册,现在知道了为什么功能函数要写在helloworld_functions这里吧

zend_module_entry helloworld_module_entry = {    STANDARD_MODULE_HEADER,    "helloworld",                        helloworld_functions,                PHP_MINIT(helloworld),                                NULL,                                PHP_RINIT(helloworld),                NULL,                                PHP_MINFO(helloworld),                PHP_HELLOWORLD_VERSION,            PHP_MODULE_GLOBALS(pib),    NULL,    NULL,    NULL,    STANDARD_MODULE_PROPERTIES_EX};

现在看看扩展的几个钩子函数

    zend_startup_extensions();

这里的核心就是func(element->data)也就是执行扩展

PHP_MINIT函数

element=l->head;    while (element) {        next = element->next;        if (func(element->data)) {            DEL_LLIST_ELEMENT(element, l);        }        element = next;    }

现在就知道PHP_MINIT钩子可以做很多初始化的功能,怎么注册一个自定义扩展的功能类,怎么把扩展的变量写到php.ini里面,怎么重写php内置函数,

original = zend_hash_str_find_ptr(CG(function_table), "var_dump", sizeof("var_dump")-1);    if (original != NULL) {        original->internal_function.handler = my_overwrite_var_dump;    }    zend_class_entry person;    INIT_CLASS_ENTRY(person,CLASS_NAME,person_functions);    zend_register_internal_class_ex(&person,NULL);

到此,相信大家对“PHP自定义扩展的钩子功能是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯