久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

PHP如何自定義擴(kuò)展(二)之鉤子功能

接著上篇來講php生命周期,看看擴(kuò)展哪些鉤子做哪些事,php生命周期大概5個(gè)階段,模塊初始化階段php_module_startup,請(qǐng)求初始化階段php_request_startup,腳本執(zhí)行階段php_execute_script,請(qǐng)求關(guān)閉階段php_request_shutdown,模塊關(guān)閉階段php_module_shutdown,下面以cli模式介紹。

php_module_startup

先看看這個(gè)階段做了什么,如果不知道php入口文件在哪,用gdb看看調(diào)用棧,gdb ./php

php_module_startup打斷點(diǎn),執(zhí)行,在看下調(diào)用棧,

b php_module_startup (gdb) r test.php bt php_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

在調(diào)用棧可以清楚看到執(zhí)行流程,現(xiàn)在到/main/main.c文件看看做了哪些事情,也可以用gdb一步一步的看,這里就講與php擴(kuò)展有關(guān)的幾個(gè)地方,這里做的初始化工作,像垃圾回收,請(qǐng)求初始化,注冊(cè)常量,php.ini配置文件加載等,

先來看看怎么加載模塊的

/* startup extensions statically compiled in */     if (php_register_internal_extensions_func() == FAILURE) {         php_printf("Unable to start builtin modulesn");         return FAILURE;     }

這里是加載php內(nèi)置的模塊,這里只貼出核心功能,先檢查依賴

/* 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;     }

這是內(nèi)置模塊加載原理,現(xiàn)在看看ini里的擴(kuò)展怎么加載

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

利用這個(gè)函數(shù)加載

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

這里面也執(zhí)行了加載內(nèi)置模塊的功能。

是調(diào)用了module->functions,進(jìn)行模塊功能函數(shù)注冊(cè),現(xiàn)在知道了為什么功能函數(shù)要寫在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 };

現(xiàn)在看看擴(kuò)展的幾個(gè)鉤子函數(shù)

/* start Zend extensions */     zend_startup_extensions();

這里的核心就是func(element->data)也就是執(zhí)行擴(kuò)展

PHP_MINIT函數(shù)

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

現(xiàn)在就知道PHP_MINIT鉤子可以做很多初始化的功能,怎么注冊(cè)一個(gè)自定義擴(kuò)展的功能類,怎么把擴(kuò)展的變量寫到php.ini里面,怎么重寫php內(nèi)置函數(shù),

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);

這里就是重寫var_dump函數(shù),注冊(cè)了一個(gè)person類,先介紹到這里,下篇就介紹怎么把php代碼通過詞法分析語法分析生成AST,然后編譯opcode指令,供zend虛擬機(jī)調(diào)用。

推薦學(xué)習(xí):《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
天堂av一区| 精品三级在线观看视频| 激情久久中文字幕| 日韩在线观看一区二区三区| 日本在线成人| 精品一区av| 综合激情婷婷| 亚洲欧美日韩国产综合精品二区| 91视频久久| 国产传媒av在线| 欧美日韩亚洲一区二区三区在线| 国产麻豆综合| 国产一区二区亚洲| 日本欧美一区二区在线观看| 国产美女视频一区二区| 亚洲欧洲日韩精品在线| 日韩精品网站| 黑人精品一区| 欧美激情视频一区二区三区在线播放| 天堂av一区| 91成人福利| 日韩综合小视频| 欧美视频久久| 免费在线成人| 美女视频黄免费的久久| 亚洲1区在线观看| 日韩精品一区二区三区中文| 亚洲ww精品| 日韩高清不卡一区二区| 日韩精品免费一区二区夜夜嗨| 欧美xxxx中国| 日韩一区精品视频| 亚洲资源网站| 石原莉奈一区二区三区在线观看| 国产欧美激情| 精品99久久| 亚洲在线电影| 日韩国产综合| 国产精品二区影院| 久久精品国产大片免费观看| 精品一区二区三区的国产在线观看| 视频一区国产视频| 中文欧美日韩| 在线一区电影| 精品中文字幕一区二区三区四区| 日韩精品久久久久久久电影99爱| 香蕉久久久久久久av网站| 日本成人在线视频网站| 亚洲久久在线| 美女视频黄 久久| 一区二区视频欧美| 国产日韩精品视频一区二区三区| 久久精品xxxxx| 国产v综合v| 欧美在线91| 影音先锋国产精品| 日韩一区二区三区免费| 视频一区二区三区入口| 国产精品视频一区二区三区四蜜臂| 欧美久久天堂| 亚洲欧美日韩在线观看a三区| 久久国内精品| 亚洲一区欧美激情| 97久久亚洲| 日韩精品网站| 成人片免费看| 国产精品videossex久久发布| 久久99青青| 国产图片一区| 免费美女久久99| 日韩精品一区二区三区中文在线 | 黑丝美女一区二区| 精品一区视频| av综合电影网站| 欧美私人啪啪vps| 欧美中文高清| 欧美国产免费| 视频一区二区中文字幕| 国精品一区二区三区| 国产不卡一区| 精品高清久久| 日韩激情网站| 夜久久久久久| 久久亚洲国产| 日韩精品免费一区二区三区| 亚洲精品国产日韩| 午夜在线视频一区二区区别| 国产精品探花在线观看| 日韩精品三区四区| 日本天堂一区| 麻豆精品久久久| 久久久久久婷| 国产图片一区| 欧美激情一区| 国产成人黄色| 麻豆精品久久久| 成人精品视频| 免费人成精品欧美精品| 激情欧美国产欧美| 久久久久久美女精品| 麻豆精品蜜桃视频网站| 国户精品久久久久久久久久久不卡| 日本а中文在线天堂| 亚洲一卡久久| 日韩精品五月天| 香蕉人人精品| 91九色精品| 精品一区欧美| 性色一区二区| 91精品国产经典在线观看| 一区二区国产在线观看| 久久av免费| 香蕉成人av| 国产一区二区三区视频在线| 日韩精品不卡一区二区| 欧美91在线| 久久中文字幕av| 一区二区电影在线观看| 国产精品欧美三级在线观看| 免费精品一区| 国产精品毛片| 日本欧洲一区二区| 136国产福利精品导航网址| 欧美综合社区国产| 久久福利精品| 亚洲有吗中文字幕| 国产v综合v| 色婷婷久久久| 国产图片一区| 日韩大片在线播放| 97精品国产一区二区三区| 亚洲精品九九| 国产网站在线| 久久精品72免费观看| 蜜桃国内精品久久久久软件9| 久久精品欧美一区| 欧美一区久久| 国产欧美一区二区三区国产幕精品| 一本一道久久a久久| 成人国产精品一区二区网站| 国产精品久久久久久久免费软件| 免费观看久久av| 亚洲精品少妇| 免费观看久久久4p| 成人看片网站| 国产专区精品| 日韩国产一区二区三区| 91成人在线| 精品久久国产一区| 美女久久久久久| 精品美女视频 | 在线观看一区| 亚洲综合丁香| 久久精品官网| 国产探花在线精品| 日韩国产综合| 日韩精品中文字幕第1页| 91免费精品| 欧美日韩亚洲一区| 国产欧美综合一区二区三区| 麻豆理论在线观看| 国产一区二区三区黄网站| 日韩精品欧美| 国产在线欧美| 日韩一区二区三区免费播放| 久久在线视频免费观看| 国产亚洲亚洲| 蜜桃视频在线观看一区二区| 亚洲午夜天堂| 99久久夜色精品国产亚洲1000部| 中文字幕亚洲影视| 久久亚洲国产精品一区二区| 欧美/亚洲一区| 欧美日韩免费看片| 久久高清免费| 免费人成精品欧美精品| 美女精品网站| 久久成人福利| 日韩综合在线| 国产99精品| 国产精品毛片视频| 亚洲精品欧美| 亚洲欧美日韩一区在线观看| 国产+成+人+亚洲欧洲在线| 日本天堂一区| 911亚洲精品| 久久精品凹凸全集| 欧美日韩国产一区二区三区不卡 | 亚洲精品伊人| 国产精品精品| 欧美精品aa| 精品国产一区二区三区2021| 蜜桃视频第一区免费观看| 不卡在线一区二区| 亚洲激情偷拍| 日韩精品一级| 国产亚洲精品久久久久婷婷瑜伽| 婷婷精品在线| 日本免费一区二区三区四区| 免费成人网www|