<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 7.3.1 擴展的構成 擴展首先需要創建一個`zend_module_entry`結構,這個變量必須是全局變量,且變量名必須是:`擴展名稱_module_entry`,內核通過這個結構得到這個擴展都提供了哪些功能,換句話說,一個擴展可以只包含一個`zend_module_entry`結構,相當于定義了一個什么功能都沒有的擴展。 ```c //zend_modules.h struct _zend_module_entry { unsigned short size; //sizeof(zend_module_entry) unsigned int zend_api; //ZEND_MODULE_API_NO unsigned char zend_debug; //是否開啟debug unsigned char zts; //是否開啟線程安全 const struct _zend_ini_entry *ini_entry; const struct _zend_module_dep *deps; const char *name; //擴展名稱,不能重復 const struct _zend_function_entry *functions; //擴展提供的內部函數列表 int (*module_startup_func)(INIT_FUNC_ARGS); //擴展初始化回調函數,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定義的函數 int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //擴展關閉時回調函數 int (*request_startup_func)(INIT_FUNC_ARGS); //請求開始前回調函數 int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //請求結束時回調函數 void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的擴展信息處理函數 const char *version; //版本 ... unsigned char type; void *handle; int module_number; //擴展的唯一編號 const char *build_id; }; ``` 這個結構包含很多成員,但并不是所有的都需要自己定義,經常用到的主要有下面幾個: * __name:__ 擴展名稱,不能重復 * __functions:__ 擴展定義的內部函數entry * __module_startup_func:__ PHP在模塊初始化時回調的hook函數,可以使擴展介入module startup階段 * __module_shutdown_func:__ 在模塊關閉階段回調的函數 * __request_startup_func:__ 在請求初始化階段回調的函數 * __request_shutdown_func:__ 在請求結束階段回調的函數 * __info_func:__ php_info()函數時調用,用于展示一些配置、運行信息 * __version:__ 擴展版本 除了上面這些需要手動設置的成員,其它部分可以通過`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏統一設置,擴展提供的內部函數及四個執行階段的鉤子函數是擴展最常用到的部分,幾乎所有的擴展都是基于這兩部分實現的。有了這個結構還需要提供一個接口來獲取這個結構變量,這個接口是統一的,擴展中通過`ZEND_GET_MODULE(extension_name)`完成這個接口的定義: ``` //zend_API.h #define ZEND_GET_MODULE(name) \ BEGIN_EXTERN_C()\ ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; }\ END_EXTERN_C() ``` 展開后可以看到,實際就是定義了一個get_module()函數,返回擴展zend_module_entry結構的地址,這就是為什么這個結構的變量名必須是`擴展名稱_module_entry`這種格式的原因。 有了擴展的zend_module_entry結構以及獲取這個結構的接口一個合格的擴展就編寫完成了,只是這個擴展目前還什么都干不了: ```c #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" zend_module_entry mytest_module_entry = { STANDARD_MODULE_HEADER, "mytest", NULL, //mytest_functions, NULL, //PHP_MINIT(mytest), NULL, //PHP_MSHUTDOWN(mytest), NULL, //PHP_RINIT(mytest), NULL, //PHP_RSHUTDOWN(mytest), NULL, //PHP_MINFO(mytest), "1.0.0", STANDARD_MODULE_PROPERTIES }; ZEND_GET_MODULE(mytest) ``` 編譯、安裝后執行`php -m`就可以看到my_test這個擴展了。
                  <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>

                              哎呀哎呀视频在线观看