<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 5.1 Your First Extension ### 配置文件 才開始,我們先用最快的(不是最標準的)的方式來建立一個代碼最少的擴展。在php源碼文件夾的ext目錄下創建一個新的文件夾,這里我取的名字叫做walu,它往往就是我們擴展的名字。其實這個文件夾可以放在任何一個位置,但是為了我們在后面介紹win32的編譯與靜態編譯,我們還是把它放在php源碼的ext目錄下。 現在,我們在這個目錄下創建一個config.m4文件,并輸入以下內容: PHP_ARG_ENABLE(walu, [Whether to enable the "walu" extension], [ enable-walu Enable "walu" extension support]) if test $PHP_WALU != "no"; then PHP_SUBST(WALU_SHARED_LIBADD) PHP_NEW_EXTENSION(walu, walu.c, $ext_shared) fi 上面PHP_ARG_ENABLE函數有三個參數,第一個參數是我們的擴展名(注意不用加引號),第二個參數是當我們運行./configure腳本時顯示的內容,最后一個參數則是我們在調用./configure --help時顯示的幫助信息。 > 也許有人會問,為什么有的擴展的開啟方式是 --enable-extname的形式,有的則是--with-extname的形式呢?其實兩者并沒有什么本質的不同,只不過enable多代表不依賴外部庫便可以直接編譯,而with大多需要依賴于第三方的lib。 > 現在,我們的擴展并不需要依賴其它的庫文件,所以我們直接使用--enable-walu便可以了。在第17章的時候我們將接觸通過CFLAGS和LDFLAGS來配置自己的擴展,使其依賴第三方庫文件才能被編譯成php擴展。 如果我們顯示運行./configure --enable-walu,那么終端環境便會自動將$PHP_WALU變量設置為yes,而PHP_SUBST函數只不過是php官方對autoconf里的AC_SUBST函數的一層封裝。 最后重要的一點是,PHP_NEW_EXTENSION函數聲明了這個擴展的名稱、需要的源文件名、此擴展的編譯形式。如果我們的擴展使用了多個文件,便可以將這多個文件名羅列在函數的參數里,如: PHP_NEW_EXTENSION(sample, sample.c sample2.c sample3.c, $ext_shared) 最后的$ext_shared參數用來聲明這個擴展不是一個靜態模塊,而是在php運行時動態加載的。 下面,我們來編寫實現擴展主邏輯的源文件walu.c: ````c //加載config.h,如果配置了的話 #ifdef HAVE_CONFIG_H #include "config.h" #endif //加載php頭文件 #include "php.h" #define phpext_walu_ptr &walu_module_entry //module entry zend_module_entry walu_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "walu", //這個地方是擴展名稱,往往我們會在這個地方使用一個宏。 NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 "2.1", //這個地方是我們擴展的版本 #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_WALU ZEND_GET_MODULE(walu) #endif ```` 這就是所有的代碼了,不過鑒于我們平時的開發習慣,往往會把這一份代碼分成兩份,一個.h文件,一個.c文件。上面的代碼只是生成了一基本的框架,而沒有任何實際的用處。 緊接著,創建一個zend_module_entry結構體,你肯定已經發現了,依據ZEND_MODULE_API_NO 是否大于等于 20010901,這個結構體需要不同的定義格式。20010901大約代表PHP4.2.0版本,所以我們現在的擴展幾乎都要包含STANDARD_MODULE_HEADER這個元素了。 其余六個成員我們可以先賦值為NULL,其實看看它們各自后面的注釋你就應該大體上了解它們各自是負責哪一方面的工作了。 最后,最底下的代碼用來標志我們的這個擴展是一個shared module。它是干么的呢?我也說不清楚,反正帶上就對了,否則擴展會工作不正常。原文解釋:This brief conditional simply adds a reference used by Zend when your extension is loaded dynamically. Don't worry about what it does or how it does it too much; just make sure that it's around or the next section won't work. ### 標準一些 根據我們平時的開發習慣,應該不會把所有代碼都寫在這一個文件里的,我們需要把上述代碼放在兩個文件里,一個頭文件,一個c文件。 ````c //php_walu.h #ifndef WALU_H #define WALU_H //加載config.h,如果配置了的話 #ifdef HAVE_CONFIG_H #include "config.h" #endif //加載php頭文件 #include "php.h" #define phpext_walu_ptr &walu_module_entry extern zend_module_entry walu_module_entry; #endif ```` 下面的是c文件 ````c //walu.c #include "php_walu.h" //module entry zend_module_entry walu_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "walu", //這個地方是擴展名稱,往往我們會在這個地方使用一個宏。 NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 "2.1", //這個地方是我們擴展的版本 #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_WALU ZEND_GET_MODULE(walu) #endif ```` ## links * 5 [Your First Extension](<5.md>) * 5.2 [編譯我們的擴展](<5.2.md>)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看