這篇文章要跟大家分享的內容是利用php呼叫so庫檔案中的程式碼,有著一定的參考價值,有需要的朋友可以參考一下
原作者charlee、原始連結 http://tech.idv2.com/2007/07/06/use-local-so-in-php/
某個功能被編譯到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呼叫so庫檔案中的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!