首頁 >後端開發 >php教程 >用php呼叫so庫檔案中的程式碼

用php呼叫so庫檔案中的程式碼

不言
不言原創
2018-04-09 10:04:157423瀏覽

這篇文章要跟大家分享的內容是利用php呼叫so庫檔案中的程式碼,有著一定的參考價值,有需要的朋友可以參考一下

某個功能被編譯到so檔中,那麼如何透過php來呼叫它?一個方法是寫一個php模組(php extension),在php中呼叫該模組內的函數再透過這個模組來呼叫so中的函數。下面做一個簡單的例子,使用的作業系統是Fedora Core 6。

先做一個簡單的so檔:

1  /**
 2   * hello.c
 3   * To compile, use following commands:
 4   *   gcc -O -c -fPIC -o hello.o hello.c 
 5   *   gcc -shared -o libhello.so hello.o
 6   */
 7  
 8  int hello_add(int a, int b)
 9  {
10      return a + b;
11  }

然後將它編譯成.so檔並放到系統中:

1 ___FCKpd___1nbsp;gcc -O -c -fPIC -o hello.o hello.c
2 ___FCKpd___1nbsp;gcc -shared -o libhello.so hello.o
3 ___FCKpd___1nbsp;su
4 # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
5 # cp libhello.so /usr/local/lib
6 # /sbin/ldconfig

寫段小程式來驗證其正確性:

 1/**
 2  * hellotest.c
 3  * To compile, use following commands:
 4  *   gcc -o hellotest -lhello hellotest.c
 5  */
 6 #include <stdio.h>
 7 int main()
 8 {
 9     int a = 3, b = 4;
10     printf("%d + %d = %d/n", a, b, hello_add(a,b));
11     return 0;
12 }

編譯並執行:

 $ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7

#OK,下面我們來製作PHP模組。首先確保你安裝了 php-devel 包,沒有的話請自行從安裝光碟上找。然後下載php原始碼。我使用的是php-5.2.3.tar.gz,解壓縮。

 $ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext

然後透過下面的指令建立一個名為 hello 的模組。

 $ ./ext_skel --extname=hello

執行該指令之後它會提示你該用什麼指令來編譯模組,可惜那是將模組整合到php內部的編譯方法。如果要編譯成可動態載入的 php_hello.so,方法要更為簡單。

 $ cd hello

先編輯config.m4 文件,去掉第16行和第18行的註解(註解符號為dnl 。)

1 16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
2 17:  dnl Make sure that the comment is aligned:
3 18:  [  --enable-hello           Enable hello support])

然後執行phpize 程序,產生configure腳本:

 $ phpize

接著開啟php_hello.h,在PHP_FUNCTION(confirm_hello_compiled); 之下加入函數宣告:

1PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
2 PHP_FUNCTION(hello_add);

開啟hello.c,在PHP_FE(confirm_hello_compiled, NULL) 下方加入下列內容。

<br/>

然後在hello.c 的最末尾書寫hello_add函數的內容:

 1PHP_FUNCTION(hello_add)
 2 {
 3     long int a, b;
 4     long int result;
 5 
 6     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
 7         return;
 8     }
 9 
10     result = hello_add(a, b);
11 
12     RETURN_LONG(result);
13 }

儲存退出,編譯並安裝:

___FCKpd___12nbsp;./configure
 ___FCKpd___12nbsp;make LDFLAGS=-lhello
 ___FCKpd___12nbsp;su
 # cp modules/hello.so /usr/lib/php/modules

然後在/var/www/html下建立一個hello.php 文件,內容如下:

 <?php
dl("hello.so");
echo hello_add(3, 4);
?>

然後在瀏覽器中開啟hello.php文件,如果顯示7,則表示函數呼叫成功了。

linux知識補充:

由於使用Editplus,預設c語言原始程式儲存為.cpp,然後我就在cygwin下用gcc進行編譯,結果總是出現一些函數undeclared,但是這些函數都是一些標準的系統調用,為何呢?


這個問題鬱悶了一下午和一晚上,後來不知道為什麼指使我試著把原始程式.cpp改成.c,結果編譯順利通過。

後來在網路上得知,在linux下,gcc是用來編譯.c檔的,而c 檔案則要用g 指令來編譯c 原始程式。

相關推薦:

利用PHP取得訪客IP、地區位置、瀏覽器及來源頁面等資訊

PHP利用PHPstorm的自動提示功能詳解

以上是用php呼叫so庫檔案中的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn