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

站長資訊網
最全最豐富的資訊網站

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

接著上篇來講php生命周期,看看擴展哪些鉤子做哪些事,php生命周期大概5個階段,模塊初始化階段php_module_startup,請求初始化階段php_request_startup,腳本執行階段php_execute_script,請求關閉階段php_request_shutdown,模塊關閉階段php_module_shutdown,下面以cli模式介紹。

php_module_startup

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

php_module_startup打斷點,執行,在看下調用棧,

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

在調用棧可以清楚看到執行流程,現在到/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 modulesn");         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);

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

推薦學習:《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲精品第一| 亚洲精品123区| 欧美中文高清| 国产欧美88| 国产精品国产三级国产在线观看| 国产精品久久| 成人国产精品久久| 亚洲国产专区校园欧美| 亚洲精品日本| 日韩专区在线视频| 欧美日韩一视频区二区| 中文字幕在线看片| 亚洲一区二区三区免费在线观看| 视频一区中文字幕精品| 成人午夜网址| 99成人在线| 国产一区二区三区不卡视频网站| 米奇777超碰欧美日韩亚洲| 日韩不卡一区二区三区 | 日韩国产欧美三级| 国产日本精品| 理论片午夜视频在线观看| 在线成人直播| 久久久久伊人| 中文字幕免费一区二区| 成人高清一区| 日韩精彩视频在线观看| 久久九九99| 国产欧美欧美| 欧美日韩国产一区二区三区不卡| 日韩av一二三| 免费久久精品| 精品伊人久久| 欧美片网站免费| 国产午夜精品一区二区三区欧美 | 欧美~级网站不卡| 美女视频网站久久| 视频精品一区| 国产理论在线| 亚洲小说春色综合另类电影| 蜜臀国产一区| 91精品蜜臀一区二区三区在线| 激情欧美亚洲| 免费在线观看精品| 免费av一区| 婷婷中文字幕一区| 国产一区二区三区亚洲| 欧美一区久久| 日韩精品成人| 亚洲va久久| 午夜一级在线看亚洲| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产视频久久| 成人精品久久| 国产日韩电影| 性欧美videohd高精| 欧美成人基地| 国产videos久久| 亚洲黄色中文字幕| 99精品视频在线| 99精品99| 蜜桃av一区| 日本特黄久久久高潮| 国产亚洲观看| 精品国产aⅴ| 精品国产18久久久久久二百| 国产一区二区三区免费在线 | 国产精品日韩| 中文一区一区三区免费在线观 | 亚洲精品乱码久久久久久蜜桃麻豆 | 久久精品动漫| 国产免费成人| 国产亚洲久久| 午夜精品成人av| 日韩视频免费| 日本欧美一区二区在线观看| 欧美极品一区二区三区| 色网在线免费观看| 午夜国产欧美理论在线播放 | 中文字幕乱码亚洲无线精品一区| 欧美日韩亚洲国产精品| 国产精品欧美一区二区三区不卡| a天堂资源在线| 久久国产精品毛片| 精品国产一区二| 久久99伊人| 男女男精品网站| 在线看片国产福利你懂的| 91精品一区二区三区综合| 国产综合色产| 国产麻豆精品久久| 国产综合欧美| 麻豆一区在线| 亚洲一区二区三区高清不卡| 蜜桃av一区二区三区电影| 国产精品theporn| 久久福利在线| 黄色av一区| 日韩国产高清在线| 日韩精品亚洲专区| 亚洲伦乱视频| 国产欧美日韩免费观看| 亚洲专区在线| 日韩欧美字幕| **爰片久久毛片| 国产精品婷婷| 99久久精品费精品国产| 久久久91麻豆精品国产一区| 日韩有吗在线观看| 91久久亚洲| 日韩精品麻豆| 不卡一二三区| 给我免费播放日韩视频| 国产精品日本一区二区三区在线 | 视频精品一区二区| 午夜欧美精品| 欧美成人亚洲| 日韩精品dvd| 国产精品高颜值在线观看| 久久久久伊人| 久久精品伊人| 成人午夜毛片| 国产精品久久久久77777丨| 玖玖精品视频| 免费在线成人网| 亚洲精选成人| 亚洲免费福利一区| 奇米亚洲欧美| 麻豆精品在线| 丁香六月综合| 米奇777超碰欧美日韩亚洲| 久久一区二区三区喷水| 91精品啪在线观看国产18| 欧美日韩中文字幕一区二区三区| 日韩成人亚洲| 久久网站免费观看| 欧美福利一区| 伊人久久成人| 欧美色图国产精品| 夜夜嗨一区二区三区| 国产日韩专区| 国产精品第一| 99成人在线视频| 亚洲另类av| 色综合五月天| 欧美中文字幕| 国产精品一区亚洲| 久久青草久久| 日韩二区三区在线观看| 亚洲一级少妇| 日韩精品一卡| 日本欧美大码aⅴ在线播放| 免费精品一区| 99视频精品| 久久久久久夜| 日韩二区三区四区| 婷婷激情一区| 久久影视一区| 麻豆精品在线观看| 亚洲成人av观看| 7777精品| 精品国产中文字幕第一页| 日韩av有码| 久久高清免费观看| 日韩精品电影一区亚洲| 欧美激情国产在线| 99国产精品久久久久久久成人热| 手机精品视频在线观看| 久久不见久久见免费视频7| 三级精品视频| 国产精品亚洲综合色区韩国| 精品国产乱码久久久| 亚洲免费成人| 国产精品分类| 国产亚洲午夜| 夜鲁夜鲁夜鲁视频在线播放| 深夜日韩欧美| 久久久影院免费| 国产伦理一区| 欧美日韩精品一区二区视频| 欧美日一区二区三区在线观看国产免 | 日本a级不卡| 亚洲激情国产| 久久69成人| 国产欧美91| 六月天综合网| 男女性色大片免费观看一区二区| a国产在线视频| 久久国产精品免费一区二区三区| 亚洲精品国产偷自在线观看| 国产欧美91| 国产精品一区二区99| 亚洲综合三区| 综合日韩av| 亚洲天堂1区| 蜜桃视频在线网站| 99精品视频在线| 成人午夜网址| 欧美日韩1区2区3区| 欧美日韩18|