php 源码封装so,在Linux下用C扩展PHP(打包成so)的方法

本文主要讲一下在Linux下用打包C扩展程序.so文件和Windows下的不同,详细的代码和配置方案请参加另一篇博客:http://blog.csdn.net/maverick1990/article/details/46519045

步骤:

1.安装php环境到目录 /usr/local/php/ 目录下

2.下载相同版本的php源码包,安装到 /root/php-5.6.9/ 目录下,可到官网http://www.php.net/downloads.php下载

执行命令:cd /root

wget http://us1.php.net/distributions/php-5.6.9.tar.bz2

tar -xf php-5.6.9.tar.bz2注意,有一些历史版本没有源码包,需要升级php到提供源码包的版本

3.到 /php-5.6.9/ext/ 目录下,使用ext_skel生成扩展骨架cd ./php-5.6.9/ext

./ext_skel --extname=test

4.修改配置文件 /test/config.m4

取消下面两行的dnl注释:PHP_ARG_ENABLE(test, whether to enable test support,

dnl Make sure that the comment is aligned:

[ --enable-test Enable test support])

如果要使用C++进行编译,要将test.c改名为test.cpp,并在config.m4中添加

PHP_REQUIRE_CXX()

PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS)

PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)

5.在php_test.h文件中添加代码,加入自定义的函数声明:

PHP_MINIT_FUNCTION(test);

PHP_MSHUTDOWN_FUNCTION(test);

PHP_RINIT_FUNCTION(test);

PHP_RSHUTDOWN_FUNCTION(test);

PHP_MINFO_FUNCTION(test);

PHP_FUNCTION(confirm_test_compiled);/* For testing, remove later. */

PHP_FUNCTION(testFunc);

6.在test.c/cpp中添加自定义函数代码:

(1)首先,在这个位置引入用到的头文件:#ifdef HAVE_CONFIG_H

#include "config.h"

#endif

#include #include #include#include "php.h"

#include "php_ini.h"

#include "ext/standard/info.h"

#include "php_test.h"否则,会出现很多函数重定义的问题,详见另一篇博客:http://blog.csdn.net/maverick1990/article/details/46786685

(2)然后,在这个位置添加函数入口:const zend_function_entry test_functions[] = {

PHP_FE(confirm_test_compiled, NULL)/* For testing, remove later. */

PHP_FE(testFunc, NULL)

PHP_FE_END/* Must be the last line in test_functions[] */

};

(3)最后,在文件尾部添加testFunc函数的代码,也可以在这里定义其他自定义函数

PHP_FUNCTION(testFunc)

{

char *x = NULL;

char *y = NULL;

int argc = ZEND_NUM_ARGS();

int x_len;

int y_len;

if (zend_parse_parameters(argc TSRMLS_CC, "ss", &x, &x_len, &y, &y_len) == FAILURE)

return;

int result_length = x_len + y_len;

char* result = (char *) emalloc(result_length + 1);

strcpy(result, x);

strcat(result, y);

RETURN_STRINGL(result, result_length, 0);

}

关于PHP_FUNCTION函数的书写方法,详见博客:http://weizhifeng.net/write-php-extension-part2-1.html

7.在 /root/php-5.6.9/ext/test/ 目录下,建立php扩展模块:phpize可能需要加上路径:

/usr/local/php/bin/phpize

8.回到 /root/php-5.6.9/ 目录,重新建立编译需要的配置:cd ../..

./buildconf --force

若出现类似的报错:buildconf: You need autoconf 2.59 or lower to build this version of PHP.

You are currently trying to use 2.63

Most distros have separate autoconf 2.13 or 2.59 packages.

On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist.

Install autoconf2.13 and set the PHP_AUTOCONF env var to

autoconf2.13 and try again.

那么,通过下面的方法解决:

yum install autoconf213

export PHP_AUTOC/bin/autoconf-2.139.再到 /root/php-5.6.9/ext/test/ 目录下,生成配置:./configure --with-php-c/local/php/bin/php-config

10.编译并生成.so扩展文件make

make install若make出错,修改代码直到编译通过

若make install出错,修改后,需要清空当前生成的扩展模块:phpize --clean

然后从第7步重新开始

11.查看test.so是否生成

make install成功后会给出生成路径,例如:/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/test.so

12.修改php.ini

修改 /usr/local/php/etc/php.ini 文件,加入扩展路径和名称:extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"

extension = "teste.so"

13.重启PHP服务service php-fpm restart

14.在PHP中使用C++扩展函数

注意:若使用扩展函数时出现错误:

PHP Warning PHP Startup Unable to initialize module

Module compiled with module API=20121212 PHP

compiled with module API=20090626

These options need to match in Unknown on line 0

这是由于编译.so文件的php源码包版本和当前使用的php版本不同所致,需要在下载当前版本的php源码包,重新编译扩展

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了在Linux下用C扩展PHP(打包成so)的方法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值