PHP自定义扩展的钩子功能是什么
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,本篇内容主要讲解"PHP自定义扩展的钩子功能是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP自定义扩展的钩子功能是什么"吧!php生命周期大概5
千家信息网最后更新 2025年02月07日PHP自定义扩展的钩子功能是什么
本篇内容主要讲解"PHP自定义扩展的钩子功能是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP自定义扩展的钩子功能是什么"吧!
php_module_startup
先看看这个阶段做了什么,如果不知道php入口文件在哪,用gdb看看调用栈,gdb ./php
在php_module_startup
打断点,执行,在看下调用栈,
b php_module_startup(gdb) r test.phpbtphp_module_startup (sf=0x1406460, 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 ) 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配置文件加载等,
先来看看怎么加载模块的
/* startup extensions statically compiled in */ if (php_register_internal_extensions_func() == FAILURE) { php_printf("Unable to start builtin modules\n"); return FAILURE; }
这里是加载php内置的模块,这里只贴出核心功能,先检查依赖
/* Check module dependencies */ 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); /* TODO: Check version relationship */ 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", /* Extension name */ helloworld_functions, /* zend_function_entry */ PHP_MINIT(helloworld), /* PHP_MINIT - Module initialization */ NULL, /* PHP_MSHUTDOWN - Module shutdown */ PHP_RINIT(helloworld), /* PHP_RINIT - Request initialization */ NULL, /* PHP_RSHUTDOWN - Request shutdown */ PHP_MINFO(helloworld), /* PHP_MINFO - Module info */ PHP_HELLOWORLD_VERSION, /* Version */ PHP_MODULE_GLOBALS(pib), NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES_EX};
现在看看扩展的几个钩子函数
/* start Zend extensions */ 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自定义扩展的钩子功能是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
功能
模块
阶段
函数
钩子
文件
内容
核心
学习
实用
更深
清楚
也就是
事情
入口
兴趣
原理
变量
周期
地方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
旭旭宝宝服务器打团
量子力学会取代网络安全
数据库缺少数据表
网络安全重要性在哪里
网络强国和网络安全PPT
互联网金融科技概念股龙头
文件服务器安全设计
ecshop是什么数据库
山西统一软件开发过程检测中心
徐汇区技术软件开发收费标准
管理类软件开发服务价格
软件开发人员所具备的技能
苏州软件开发薪资多少
腾讯云服务器如何跟电脑
数据库基础 题库
cdept数据库什么意思
济南软件开发招聘信息
网络安全手抄报标语简洁
软件开发的八种模型
如何建授时服务器
买数据库数据是学术不端吗
高科技互联网公司是真的吗
幻塔联机需要选择一样的服务器吗
网络安全舆论管理信息
手机代理服务器怎么打开
微信小程序云数据库增删改查
合肥到叶集高速有几个服务器
html5数据库对比
有关网络安全的活动方案
利用展板宣传网络安全