PHP呼叫C函式簡單例子
阿新 • • 發佈:2019-02-19
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資訊中可以看到擴充套件庫的產生
?>