php呼叫c語言編寫的so動態庫

2021-06-03 19:40:10 字數 3912 閱讀 5758

php除了使用擴充套件庫的方式呼叫c函式,還可以通過socket通訊的方式。這裡介紹前者。

1. 先看本機是否已經安裝了較低版本的php

#find /usr -name "php"

或者rpm -aq | grep php

如果存在,就使用rpm命令等方式卸掉

2. php原始碼安裝,configure的引數如下

#./configure  --prefix=/usr/local/php   --with-mysql --with-mysqli  --enable-so  --with-pdo-mysq=/var/lib/mysql  --with-apxs2=/usr/local/apache/bin/apxs --with-zlib --enable-zip --enable-mbstring

3. 如果已經安裝了兩個版本的php,使用apache函式,確定使用的是哪個版本的php

[html]view plain

copy

print?

<

html

>

<

body

>

<?

phpecho "hello world";  

phpinfo();  

?>

body

>

html

>

4. 如果已經安裝了兩個版本的php,使用php檢視版本號或確定php.ini的配置檔案

#/usr/local/php/bin/php -v

#/usr/local/php/bin/php -i | grep php.ini

[cpp]view plain

copy

print?

#vim hello.c

int cc_add(int a, int b)  

# gcc -o -c -fpic -o hello.o hello.c                      // -fpic:是指生成的動態庫與位置無關

# gcc -shared -o libhello.so hello.o                     // -shared:是指明生成動態鏈結庫

# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf       //  把庫位址寫入到配置檔案中

# /sbin/ldconfig                // 用此命令,使剛才寫的配置檔案生效

以下是測試so檔案

[cpp]view plain

copy

print?

#include 

int main()  

#gcc -o hellotest -lhello hellotest.c                // 編譯測試檔案,生成測試程式

#./hellotest           // 執行測試程式

1. 然後通過下面的命令用ext_skel指令碼建立乙個名為 hello 的模組:

#cd php-5.3.6/ext

#./ext_skel --extname=hello

2. 執行該命令之後它會提示你應當用什麼命令來編譯模組,可惜那是將模組整合到php內部的編譯方法。

如果要編譯成可動態載入的 php_hello.so,方法要更為簡單。

#cd hello

首先編輯 config.m4 檔案,去掉注釋(注釋符號為 dnl 。)

# vim config.m4

php_arg_enable(hello, whether to enable hello support,

dnl make sure that the comment is aligned:

[  --enable-hello           enable hello support])

3. 然後執行 phpize 程式,生成configure指令碼:

#phpize

4. 開啟 php_hello.h,在 php_function(confirm_hello_compiled); 之下加入函式宣告:

php_function(confirm_hello_compiled);   /* for testing, remove later. */

php_function(hello_add);

5. 開啟 hello.c,在 php_fe(confirm_hello_compiled, null) 下方加入以下內容。

[php]view plain

copy

print?

zend_function_entry hello_functions =   /* must be the last line in hello_functions */};  

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

php_function(hello_add)  

result = cc_add(a, b);  

return_long(result);  

}  

6.配置安裝

#./configure --with-php-config=/usr/local/php/bin/php-config

#make ldflags=-lhello

#make install

installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

#cp modules/hello.so /usr/lib/php/modules

#vim /etc/php5/apache2/php.ini

enable_dl = off; //允許dl()動態載入so擴充套件功能enable_dl = on

然後在 /var/www/html 下建立乙個 hello.php 檔案,內容如下:

[html]view plain

copy

print?

<

html

>

<

body

>

<?

phpdl("hello.so");  

echo hello_add(4, 6);  

?>

body

>

html

>

然後在瀏覽器中開啟hello.php檔案,如果顯示10,則說明函式呼叫成功了。

另外可以在apache重啟的時候讓我們的so庫直接動態編譯進php5,就像linux的insmod hello.ko模組一樣,不用dl載入也不用重新編譯php,就可以直接使用so的函式了,步驟如下:

# vim /etc/php5/apache2/php.ini

enable_dl = off

extension=hello.so

[注意,這種方式只適合hello.so庫內所有功能**已經全部除錯ok,如果還處在除錯期間,那麼需要採用上面的dl強制載入的方式]

[html]view plain

copy

print?

**如下:  

<

html

>

<

body

>

<?

phpecho hello_add(4, 6);  

?>

body

>

html

>

php呼叫c語言編寫的so動態庫

php除了使用擴充套件庫的方式呼叫c函式,還可以通過socket通訊的方式。這裡介紹前者。1.先看本機是否已經安裝了較低版本的php find usr name php 或者rpm aq grep php 如果存在,就使用rpm命令等方式卸掉 2.php原始碼安裝,configure的引數如下 co...

c語言呼叫c語言的so動態庫

1.環境 ubuntu14.o4 gcc 4.8.4 2.庫檔案生成 1 原始碼 int add int a,int b 2 生成庫檔案 cd到cltest.c所在目錄,輸入命令 gcc shared o libcltest.so cltest.c會在當前目錄生成檔案libcltest.so 3.主...

c 呼叫c 的so動態庫2

1.環境 ubuntu 14.04 g 4.8.4 2.有類的情況 1 庫檔案 a 原始碼 class cal typedef cal creat t typedef void destroy t cal include cppl2.h cal cal cal cal int cal add int...