亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP擴展開發內核執行流程與擴展結構

2020-03-22 19:17:42
字體:
來源:轉載
供稿:網友
  • 在開發擴展之前,最好了解下PHP內核的執行流程,PHP大概包括三個方面:

    SAPI
    Zend VM
    內部擴展

    Zend VM是PHP的虛擬機,與JVM類似,都是各自語言的編譯/執行的核心。它們都會把各自的代碼先編譯為一種中間代碼,PHP的通常叫opcode,Java通常叫bytecode,不同的是PHP的opcode直接被Zend VM的執行單元調用對應的C函數執行,不會顯示保留下來(可以cache保留),而Java通常是生成html' target='_blank'>class文件保留下來。而這一點可能也是PHP interpreter的名稱的由來吧。其實相對嚴格的C/C++等編譯型語言,PHP和Java更多的是結合了編譯型和解釋性的風格。SAPI可以看作是Zend VM向外界提供編譯/執行PHP代碼服務的方式和規范。無論是作為cli/cgi/fastcgi/apache_mod與其他程序交互,還是嵌入其他語言中如C/C++等,都可以通過SAPI的規范實現。它的一個重要數據結構就是sapi_module_struct(main/SAPI.h line 217)內部擴展部分可以看作是搭建在Zend VM和SAPI之上的庫,為PHP開發人員提供性能和易用性上的保證。Java的各種包/Python的各種模塊功能類似,不同的是PHP中為了性能是用C擴展來實現的,類似的在Java中可以通過JNI來實現,Python中如_socket和_select(多路復用)都不是原生Python實現。

    生命周期

    關于各種SAPI或者PHP本身的生命周期,可能會和其他組件如apache耦合,后續再細談。關于PHP擴展的生命周期,這里借用一張圖。流程應該是很容易明白的,關于這個過程,網上也有很多資料,不再贅述。我們開發擴展需要注意的幾個地方也可以對應到圖中的某些節點:

    全局變量的定義,通常是zend_modulename_globals
    模塊的初始化,包括資源/類/常量/ini配置等模塊級的初始化
    請求的初始化,包括與單次請求相關的一些初始化
    請求的結束,清理單次請求相關的數據/內存
    模塊的卸載,清理模塊相關的數據/內存

    基本上我們要做的就是按照上面的流程,實現相關的內置函數,定義自己的資源/全局變量/類/函數等。值得注意的地方是在在嵌入其他語言如Python或者被嵌入其他組件如apache時,要小心多進程多線程相關的問題。

    PHP擴展結構

    使用php-src/ext/ext_skel可以生成PHP擴展的框架

    ./ext_skel --extname=myext[tan@tan ~/software/needbak/php-5.5.20/ext 12:24]$==> ls myext/config.m4  config.w32  CREDITS  EXPERIMENTAL  myext.c  myext.php  php_myext.h  tests

    比較重要的文件是config.m4(當然還有源碼),config.m4文件可以使用phpize命令生成configure文件,其中說明了我們是否開啟模塊,以及外部依賴的庫。

    //config.m4//如果你的擴展依賴其他外部庫dnl PHP_ARG_WITH(myext, for myext support,dnl Make sure that the comment is aligned:dnl [  --with-myext             Include myext support])//擴展不依賴外部庫dnl PHP_ARG_ENABLE(myext, whether to enable myext support,dnl Make sure that the comment is aligned:dnl [  --enable-myext           Enable myext support])//尋找并包含頭文件if test "$PHP_MYEXT" != "no"; then  dnl Write more examples of tests here...  dnl # --with-myext -> check with-path  dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this  dnl SEARCH_FOR="/include/myext.h"  # you most likely want to change this  dnl if test -r $PHP_MYEXT/$SEARCH_FOR; then # path given as parameter  dnl   MYEXT_DIR=$PHP_MYEXT  dnl else # search default path list  dnl   AC_MSG_CHECKING([for myext files in default path])  dnl   for i in $SEARCH_PATH ; do  dnl     if test -r $i/$SEARCH_FOR; then  dnl       MYEXT_DIR=$i  dnl       AC_MSG_RESULT(found in $i)  dnl     fi  dnl   done  dnl fi  dnl  dnl if test -z "$MYEXT_DIR"; then  dnl   AC_MSG_RESULT([not found])  dnl   AC_MSG_ERROR([Please reinstall the myext distribution])  dnl fi  dnl # --with-myext -> add include path  dnl PHP_ADD_INCLUDE($MYEXT_DIR/include)  //加載的lib位置  dnl # --with-myext -> check for lib and symbol presence  dnl LIBNAME=myext # you may want to change this  dnl LIBSYMBOL=myext # you most likely want to change this   dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,  dnl [  dnl   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MYEXT_DIR/$PHP_LIBDIR, MYEXT_SHARED_LIBADD)  dnl   AC_DEFINE(HAVE_MYEXTLIB,1,[ ])  dnl ],[  dnl   AC_MSG_ERROR([wrong myext lib version or lib not found])  dnl ],[  dnl   -L$MYEXT_DIR/$PHP_LIBDIR -lm  dnl ])  dnl  dnl PHP_SUBST(MYEXT_SHARED_LIBADD)  PHP_NEW_EXTENSION(myext, myext.c, $ext_shared)fi
    //php_myext.h#ifndef PHP_MYEXT_H#define PHP_MYEXT_Hextern zend_module_entry myext_module_entry;#define phpext_myext_ptr &myext_module_entry//導出符號,在鏈接的時候有用#ifdef PHP_WIN32#   define PHP_MYEXT_API __declspec(dllexport)#elif defined(__GNUC__) && __GNUC__ >= 4#   define PHP_MYEXT_API __attribute__ ((visibility("default")))#else#   define PHP_MYEXT_API#endif#ifdef ZTS#include "TSRM.h"#endif//幾個核心函數的聲明PHP_MINIT_FUNCTION(myext);PHP_MSHUTDOWN_FUNCTION(myext);PHP_RINIT_FUNCTION(myext);PHP_RSHUTDOWN_FUNCTION(myext);PHP_MINFO_FUNCTION(myext);//自動生成的測試函數聲明,我們自己定義的模塊函數需要在此聲明PHP_FUNCTION(confirm_myext_compiled);   //全局變量在這定義,展開后是zend_myext_globals結構體ZEND_BEGIN_MODULE_GLOBALS(myext)    long  global_value;    char *global_string;ZEND_END_MODULE_GLOBALS(myext)//線程安全與非線程安全下獲取全局變量的方式#ifdef ZTS#define MYEXT_G(v) TSRMG(myext_globals_id, zend_myext_globals *, v)#else#define MYEXT_G(v) (myext_globals.v)#endif#endif  /* PHP_MYEXT_H */
    //myext.c#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_ini.h"#include "ext/standard/info.h"#include "php_myext.h"http://全局變量聲明ZEND_DECLARE_MODULE_GLOBALS(myext)/* True global resources - no need for thread safety here */static int le_myext;//模塊函數的導出const zend_function_entry myext_functions[] = {    PHP_FE(confirm_myext_compiled,  NULL)       /* For testing, remove later. */    PHP_FE_END  /* Must be the last line in myext_functions[] */};//模塊結構zend_module_entry myext_module_entry = {#if ZEND_MODULE_API_NO >= 20010901    STANDARD_MODULE_HEADER,#endif    "myext",    myext_functions,    PHP_MINIT(myext),    PHP_MSHUTDOWN(myext),    PHP_RINIT(myext),       /* Replace with NULL if there's nothing to do at request start */    PHP_RSHUTDOWN(myext),   /* Replace with NULL if there's nothing to do at request end */    PHP_MINFO(myext),#if ZEND_MODULE_API_NO >= 20010901    PHP_MYEXT_VERSION,#endif    STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_MYEXTZEND_GET_MODULE(myext)#endif//ini配置文件的設置PHP_INI_BEGIN()    STD_PHP_INI_ENTRY("myext.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_myext_globals, myext_globals)    STD_PHP_INI_ENTRY("myext.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_myext_globals, myext_globals)PHP_INI_END()//初始化全局變量static void php_myext_init_globals(zend_myext_globals *myext_globals){    myext_globals->global_value = 0;    myext_globals->global_string = NULL;}//模塊加載時的函數PHP_MINIT_FUNCTION(myext){    /* If you have INI entries, uncomment these lines     REGISTER_INI_ENTRIES();    */    return SUCCESS;}//模塊卸載時函數PHP_MSHUTDOWN_FUNCTION(myext){    /* uncomment this line if you have INI entries    UNREGISTER_INI_ENTRIES();    */    return SUCCESS;}//請求初始化函數PHP_RINIT_FUNCTION(myext){    return SUCCESS;}//請求關閉函數PHP_RSHUTDOWN_FUNCTION(myext){    return SUCCESS;}//模塊信息,phpinfoPHP_MINFO_FUNCTION(myext){    php_info_print_table_start();    php_info_print_table_header(2, "myext support", "enabled");    php_info_print_table_end();    /* Remove comments if you have entries in php.ini    DISPLAY_INI_ENTRIES();    */}//測試函數PHP_FUNCTION(confirm_myext_compiled){    char *arg = NULL;    int arg_len, len;    char *strg;    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {        return;    }    len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "myext", arg);    RETURN_STRINGL(strg, len, 0);}
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    精品动漫一区二区三区| 国产精品久久9| 亚洲第一网站免费视频| 欧美激情视频在线观看| 成人免费网站在线| 久久久久久亚洲精品不卡| 77777亚洲午夜久久多人| 亚洲成人av片在线观看| 久久久久亚洲精品成人网小说| 久久久精品在线观看| 欧美日韩中国免费专区在线看| 视频在线观看99| 久久99国产精品久久久久久久久| 欧美怡红院视频一区二区三区| 日韩av男人的天堂| 日韩欧美一区二区三区久久| 欧美极品少妇xxxxⅹ喷水| 日韩美女在线观看一区| 日韩高清不卡av| 国产成人一区二区三区电影| 热99精品里视频精品| 国产精品网红福利| 国产精品678| 久久久久久久999精品视频| 538国产精品视频一区二区| 中文字幕日韩av| 国产精品视频网址| 91国产美女在线观看| 色综合亚洲精品激情狠狠| 精品高清美女精品国产区| 亚洲精选在线观看| 91精品视频播放| 777午夜精品福利在线观看| 欧美亚州一区二区三区| 亚洲国产黄色片| 96pao国产成视频永久免费| 国产亚洲精品久久久| 在线看福利67194| 亚洲欧美国内爽妇网| 久久久噜噜噜久久中文字免| 欧美疯狂做受xxxx高潮| 成人精品网站在线观看| 久久久午夜视频| 国内精品视频一区| 久久久女人电视剧免费播放下载| 少妇激情综合网| 国产精品尤物福利片在线观看| 日韩人在线观看| 欧美日本国产在线| 国产精品日韩在线观看| 97在线看免费观看视频在线观看| 久久视频这里只有精品| 伊人久久免费视频| 久久偷看各类女兵18女厕嘘嘘| 国产精品久久久久久久久久久新郎| 欧美日本黄视频| 亚洲男女自偷自拍图片另类| 91精品视频在线免费观看| 午夜精品久久久久久久男人的天堂| 欧美超级乱淫片喷水| 国产一区红桃视频| 成人精品福利视频| 亚洲性视频网站| 国产精品老女人精品视频| 久久最新资源网| 高清欧美一区二区三区| 亚洲在线观看视频网站| 日韩成人高清在线| 亚洲色图18p| 成人av色在线观看| 国产精品久久久久久av下载红粉| 国产精品一区二区久久精品| 久久精品国产一区二区三区| 成人国产精品av| 精品亚洲一区二区三区| 日韩在线观看成人| 久久视频在线观看免费| 亚洲精品日韩丝袜精品| 色噜噜国产精品视频一区二区| 亚洲欧美日韩直播| 日韩精品视频观看| 亚洲18私人小影院| 亚洲欧美国产一本综合首页| 亚洲欧美日韩高清| 久青草国产97香蕉在线视频| 久久精品国产综合| 亚洲qvod图片区电影| 成人免费福利在线| 中文字幕日韩综合av| 日韩电影免费观看中文字幕| 久久男人av资源网站| 久久国产精品久久国产精品| 欧美性xxxx在线播放| 国产精品99久久99久久久二8| 久久久噜噜噜久久| 亚洲欧美日韩一区在线| 国产精品视频999| 国产在线98福利播放视频| 国产一区二区三区在线视频| 国产亚洲精品久久久久久| 亚洲欧美日韩中文在线| 韩剧1988免费观看全集| 国产亚洲精品久久久久久| 国产精品美女av| 国产成人精品综合久久久| 日韩精品在线视频观看| 日韩欧美中文字幕在线播放| 国产精品亚洲网站| 日韩精品在线观看视频| 亚洲精品美女免费| 精品高清美女精品国产区| 97精品欧美一区二区三区| 国产精品va在线播放我和闺蜜| 亚洲最大福利网站| 九九精品在线播放| 日韩久久精品电影| www.久久草.com| 国产精品伦子伦免费视频| 国语自产精品视频在线看抢先版图片| 日本19禁啪啪免费观看www| 伊人久久久久久久久久久| 欧美一区二区三区四区在线| 成人在线免费观看视视频| 久久久久久伊人| 成人在线视频网站| 日韩欧美一区二区在线| 国产在线观看精品一区二区三区| 精品magnet| 久久久人成影片一区二区三区| 日韩在线免费视频观看| 亚洲精品第一国产综合精品| 国产成人jvid在线播放| 亚洲国产97在线精品一区| 亚洲视频在线观看视频| 成人网中文字幕| 国产69久久精品成人| 欧美中文字幕在线观看| 国产日韩在线精品av| 国产精品第1页| 色yeye香蕉凹凸一区二区av| 69视频在线免费观看| 国产精品毛片a∨一区二区三区|国| 青青草一区二区| 插插插亚洲综合网| 国产精品国产自产拍高清av水多| 热久久免费视频精品| 欧美交受高潮1| 精品久久久久久电影| 亚洲国产福利在线| 成人免费网站在线| 久久99精品久久久久久琪琪| 国产a级全部精品| 亚洲深夜福利在线| www国产精品视频| 国内精品免费午夜毛片| 日韩成人在线视频网站| 亚洲社区在线观看| 国产精品欧美激情在线播放| 欧美日本啪啪无遮挡网站| 久久久久久久久电影| 欧美激情综合亚洲一二区| 亚洲精选中文字幕| 亚洲精品成人av| 欧美高跟鞋交xxxxxhd|