1. 程式人生 > >PHP呼叫C函式簡單例子

PHP呼叫C函式簡單例子

1、找到PHP擴充套件指令碼ext_skel,ext_skel是PHP原始碼中的指令碼工具,位於目錄ext下

find / -name ext_skel

2、 生成名字為helloworld的目錄,該目錄包含所需的檔案

./ext_skel --extname=helloworld
# cd helloworld/
# ls
config.m4  config.w32  CREDITS  EXPERIMENTAL  helloworld.c  
helloworld.php  php_helloworld.h  tests

3、修改config.m4

//修改
dnl PHP_ARG_WITH(helloworld, for
helloworld support, dnl Make sure that the comment is aligned: dnl [ --with-helloworld Include helloworld support]) //為 PHP_ARG_WITH(helloworld, for helloworld support, [ --with-helloworld Include helloworld support]) //dnl 代表註釋,下邊 –enable-myext,是表示編譯到php核心中。with是作為動態連結庫載入,with還對於需要另外庫的函式

4、修改php_helloworld.h,(php7就不需要修改.h檔案,直接在.c中新增函式)

//這裡就是擴充套件函式宣告部分
PHP_FUNCTION(confirm_myext_compiled); 下面增加一行
PHP_FUNCTION(myext_helloworld); //表示聲明瞭一個myext_helloworld的擴充套件函式。

5、然後修改helloworld.c,這個是擴充套件函式的實現部分

//修改
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[] */ }; //這是函式主體,我們將我們的函式myext_helloworld的指標註冊到PHP_FE,必須以PHP_FE_END 結束 const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */ }; //在helloworld.c末尾加myext_helloworld的執行程式碼。 PHP_FUNCTION(myext_helloworld) { char *arg = NULL; int arg_len, len; //這裡說明該函式需要傳遞一個字串引數為arg指標的地址,及字串的長度 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!\n"); RETURN_TRUE; } //zend_parse_parameters的引數(類似scanf): ZEND_NUM_ARGS():傳遞給函式引數總個數的巨集。 TSRMLS_CC:為了執行緒安全,巨集。 "s":指定引數型別,s代表字串。 &arg:傳進來的引數存放在arg中 &arg_len:存放字串長度 //返回值實現, RETURN_type()

6、引數傳遞和返回值
(1)zend_parse_parameters的引數(類似scanf):

ZEND_NUM_ARGS():傳遞給函式引數總個數的巨集。
TSRMLS_CC:為了執行緒安全,巨集。
"s":指定引數型別,s代表字串。
&arg:傳進來的引數存放在arg中
&arg_len:存放字串長度

這裡寫圖片描述

(2)返回值實現, RETURN_type()
這裡寫圖片描述

7、在helloworld目錄下依次執行phpize、./configure 、make、make install

//執行make install時,可以看到本地php的預設擴充套件讀取目錄
root@iZuf6fih:/code/php5-5.5.9+dfsg/ext/helloworld# make install
Installing shared extensions:     /usr/lib/php5/20121212/

//進入/usr/lib/php5/20121212/可以看到生成的 helloworld.so
root@iZuf6fih# cd  /usr/lib/php5/20121212/
root@iZuf6fih:/usr/lib/php5/20121212# ls
beacon.so  helloworld.so  json.so  lary.so  mysqli.so  mysql.so  opcache.so  pdo_mysql.so  pdo.so  readline.so

8、把編譯出的.so檔案加入php.ini中:

//php.ini一般位於/etc/php/7.0/apache2/php.ini下,在php.ini中搜索extension =,然後在下一行新增
extension =  /usr/lib/php5/20121212/helloworld.so

9、重啟apache

sudo /etc/init.d/apache2 restart

10、然後編寫一個簡單的php指令碼來呼叫擴充套件函式:

<php
echo myext_helloworld();
phpinfo();//輸出的php資訊中可以看到擴充套件庫的產生
?>