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...