在Linux下用C扩展PHP(打包成so)的方法

原创 2015年07月07日 11:52:24

本文主要讲一下在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 <stdio.h>
#include <string.h>
#include <math.h>
#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_AUTOCONF=/usr/bin/autoconf-2.13


9.再到 /root/php-5.6.9/ext/test/ 目录下,生成配置:

./configure --with-php-config=/usr/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 
$concat_str = testFunc("concat1","concat2");
echo $concat_str;
?>

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

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下so动态库一些不为人知的秘密

linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。        基本上每一个linux 程序都至少会有一个动态库,查...
  • suwei19870312
  • suwei19870312
  • 2014年02月27日 13:16
  • 8248

PHP扩展开发之动态加载so模块与静态重编译PHP(下)

1.在/usr/local/src/php-7.0.9/ext目录下创建my_dynamic.def[root@bogon ext]$ vi my_dynamic.def string my_dyna...
  • xujunabc999
  • xujunabc999
  • 2016年10月20日 11:51
  • 1142

php 自定义扩展

一、开始准备 1. 系统环境:cento 2. AP环境:即已经装好的Apache、PHP5.3.3环境(可以执行代码echo phpinfo 查看版本) 3. 下载PHP源码包:下载稳定版本...
  • p_Tsui
  • p_Tsui
  • 2016年07月15日 15:57
  • 560

编写php自定义扩展

有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一...
  • b1303110335
  • b1303110335
  • 2017年09月06日 12:00
  • 260

Windows下编译使用Android NDK,调用SO文件

一、首先下载android-ndk,官方网站是:http://developer.android.com/tools/sdk/ndk/index.html 目前最新的版本是android-ndk-r...
  • asmcvc
  • asmcvc
  • 2013年07月12日 14:54
  • 20909

Linux下PHP5.6编译参数详解

http://segmentfault.com/a/1190000002717262 Linux下编译PHP时选项参数相当多,今天下决心./configure --help > help....
  • ztguang
  • ztguang
  • 2016年02月01日 00:00
  • 1556

php扩展模块的安装和编写

1.PHP的源码安装(以php6为例)   从官网下载php6的源码,解压 进入解压之后的文件夹 ./buildconf  --force ./configure  --prefix=/us...
  • u013052408
  • u013052408
  • 2015年12月01日 23:27
  • 584

SOPHP微信公众号免费开源推广

SOPHPCMS微信营销系统是基于SOPHP微信开源框架开发的一款多公众号微信营销系统。是由重庆,河南,武汉,云南多家公司共同投资,开发团队经验丰富,同时又有丰富的市场推广经验,了解市场需求,深度把握...
  • lxx180157
  • lxx180157
  • 2017年04月12日 09:26
  • 403

AndroidStudio编译.SO库文件心得一

文本心得通过以下三篇文章习来: Android Studio开发JNI工程 Android Sutdio开发NDK工程 在Android Studio中直接编译C/C++文件 ...
  • q919233914
  • q919233914
  • 2016年08月16日 11:09
  • 2447

mac os x 将C文件编译成.so库

应用背景 将C语言写好的代码提供给unity调用,项目要在Android手机上运行,所以要将C代码编译成.so库。 步骤: 1、下载安装Android studio(其实也可以不下载,楼主为了省事,直...
  • boy313918205
  • boy313918205
  • 2016年12月14日 21:11
  • 1867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Linux下用C扩展PHP(打包成so)的方法
举报原因:
原因补充:

(最多只允许输入30个字)