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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] > [簡書參考](https://www.jianshu.com/p/24449949e945) > [鳥哥參考](http://www.laruence.com/2009/04/28/719.html) > [php7 的擴展](https://segmentfault.com/a/1190000007575322) ## 下載php源碼包 如: http://php.net/get/php-5.6.1.tar.bz2/from/a/mirror 以下內容屬于php5.6 進入php的`ext` 目錄,執行 `./ext_skel --extname=demo_name` ## 編寫具體代碼 1. `config.m4` ``` //修改成如下 PHP_ARG_WITH(hello, for hello support, [ --with-hello Include hello support]) ``` 2. ` php_demo_name.h` ```c PHP_FUNCTION(hello); //在.h 的頭文件聲明你要是實現的函數名 ``` 3. `demo_name.c` ``` //在中間插入你的函數名 const zend_function_entry dmeo_functions[] = { PHP_FE(confirm_dmeo_compiled, NULL) PHP_FE(hello, NULL) /*此處是自己添加的 */ PHP_FE_END }; //文件最后,加上具體實現 PHP_FUNCTION(hello) { php_printf("Hello World!\n"); RETURN_TRUE; } ``` 4. 編譯安裝 ``` > phpize > ./configure --with-php-config=/you/ath/bin/php-config > make > sudo make install > php -r"demo_name();"; ``` > 如果沒有效果 可以重啟`php-fpm` ## 分析某個自定義函數 ``` PHP_FUNCTION(self_concat){ char *str = NULL; int argc = ZEND_NUM_ARGS(); int str_len; long n; if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE) return; php_error(E_WARNING, "self_concat: not yet implemented"); } ``` ``` zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, …); 參數: int num_args 傳遞給函數的參數個數,通常做法是`ZEND_NUM_ARGS()` 來確定傳遞參數個數 TSRMLS_DC 為了線程安全 char *type_spec 指定了函數期望的參數類型,例子中 是"sl",定義的函數接受的每次參數都需要定義類型 類型指定符 對應的C類型 描述 l long 符號整數 d double 浮點數 s char *, int 二進制字符串,長度 b zend_bool 邏輯型(1或0) r zval * 資源(文件指針,數據庫連接等) a zval * 聯合數組 o zval * 任何類型的對象 O zval * 指定類型的對象。需要提供目標對象的類類型 z zval * 無任何操作的zval ``` ## 函數返回值 |設置返回值并且結束函數 | 設置返回值 | 宏返回類型和參數 | |---|---|---| |RETURN_LONG(l) | RETVAL_LONG(l) | 整數 | |RETURN_BOOL(b) | RETVAL_BOOL(b) | 布爾數(1或0)| |RETURN_NULL()| RETVAL_NULL() |NULL |RETURN_DOUBLE(d) |RETVAL_DOUBLE(d) |浮點數| |RETURN_STRING(s, dup)| RETVAL_STRING(s, dup) |字符串。如果dup為1,引擎會調用estrdup()重復s,使用拷貝。如果dup為0,就使用s| |RETURN_STRINGL(s, l, dup) |RETVAL_STRINGL(s, l, dup) |長度為l的字符串值。與上一個宏一樣,但因為s的長度被指定,所以速度更快。| |RETURN_TRUE |RETVAL_TRUE |返回布爾值true。注意到這個宏沒有括號。| |RETURN_FALSE| RETVAL_FALSE |返回布爾值false。注意到這個宏沒有括號。| |RETURN_RESOURCE(r) | RETVAL_RESOURCE(r) | 資源句柄。| ## 函數聲明(.def) 在`ext`下創建創建函數聲明如`myfunc.def` ``` int hello_add(int x,int y) string hello(string x, string y) ``` 創建了兩個將來可以被php調用的函數聲明 在編寫`.c`文件時,就自動創建了`PHP_FUNCTION(hello_add)`和`PHP_FUNCTION(hello)`. 且參數與返回值按照php的擴展標準 `php ./ext_skel.php --extname=myfunc --proto=myfunc.def` > 編譯時,需要帶`-proto=myfunc.def` 參數
                  <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>

                              哎呀哎呀视频在线观看