您的位置:首页 > 编程语言 > C语言/C++

Ubuntu 下php调用c语言.so文件

2016-12-02 16:06 363 查看
写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。

首先做一个简单的so文件:

/**

* gcc -O-c -fPIC -ohello.ohello.c

* gcc -shared -o libhello.sohello.o

*/

int[code]hello_add(
int
a,
int
b)

{

    
return
a + b;

}


然后将它编译成.so文件并放到系统中:

$[code]gcc -
O
-c -fPIC -ohello.ohello.c

$[code]gcc -shared -o libhello.sohello.o

$[code]su

# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf 

# cp libhello.so /usr/local/lib

# /sbin/ldconfig


写段小程序来验证其正确性:

/**

*hellotest.c

*   gcc -ohellotest -lhellohellotest.c

*/

#include <stdio.h>

int[code] main()

{

    
int
a =
3
,b =
4
;

    printf(
"%d + %d=%d\n"
,a,b,hello_add(a,b));

    
return
0
;

}


编译并执行:

$[code]gcc -ohellotest -lhellohellotest.c

$[code]./hellotest

3[code] +
4
=
7[/code]

经测试。在Ubuntu上无法通过编译,在Centos下正常编译,见下图,但是不影响后面的使用

下面我们制作PHP模块。首先确保安装了 php5-dev 包

$[code]apt-get install php5-dev


然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。

$wget http://eduunix.ccut.edu.cn/index2/php/php/php-5.3.6.tar.gz[/code] 
$[code]tar xzvf php-
5.3.6
.tar.gz

$[code]cd php-
5.3.6
/ext


然后通过下面的命令建立一个名为 hello 的模块。

$[code]./ext_skel --extname=hello


执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。如果要编译成可动态加载的 php_hello.so,方法要更为简单。

$
cd
hello


首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl )

16[code]:
 PHP_ARG_ENABLE(hello,whether to enablehello support,[/code]
17[code]:
 dnl Make sure that the comment is aligned:[/code]
18[code]:
 [  --enable-hello           Enablehello support])[/code]

然后执行 phpize5 程序,生成configure脚本:

$[code]phpize5


然后打开 php_hello.h,在 
PHP_FUNCTION(confirm_hello_compiled);
 之下加入函数声明:

PHP_FUNCTION(confirm_hello_compiled);   
/* For testing,remove later.*/[/code]
PHP_FUNCTION(hello_add);


打开 hello.c,在 
PHP_FE(confirm_hello_compiled,
NULL)
 下方加入以下内容。

zend_function_entryhello_functions[]={

    PHP_FE(confirm_hello_compiled, 
NULL
)       
/* For testing,remove later.*/[/code]
    PHP_FE(hello_add,   
NULL
)       
/* For testing,remove later.*/[/code]
    {
NULL
,
NULL
,
NULL
}  
/* Must be the last line inhello_functions[]*/[/code]
};


然后在 hello.c 的最末尾书写hello_add函数的内容:

PHP_FUNCTION(hello_add)

{

    
long
int
a,b;

    
long
int
result;

    
if
 (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"ll"
,&a,&b) == FAILURE) {

        
return
;

}

    result=hello_add(a,b);

    RETURN_LONG(result);

}


保存退出,编译并安装:

$[code]./configure

$[code]make 
LDFLAGS
=-lhello

$[code]sudo make install 
此命令会将
so
放在
php
的扩展文件去


编辑php的配置文件加载so库

$[code]./configure

$[code]vim /etc/php5/apache2/php.ini

找到
extension
部分,加入
extension=hello.so


 

然后在 /var/www/ 下建立一个 hello.php 文件,内容如下:

<?php

    echohello_add(3,4);

?>


然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。

http://blog.csdn.net/sbsujjbcy/article/details/42806865
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: