Ubuntu下PHP安装C扩展

阅读更多
一、服务器环境

- Ubuntu 16.04.2 LTS x64
- PHP 7.0.21

二、服务器端软件安装

安装apache2

    apt-get install apache2

安装php

    apt-get install php7.0
    apt-get install php7.0-dev
    apt-get install libapache2-mod-php7.0
   
    // Ubuntu 14.04, php5.6.32
    apt-get install python-software-properties
    add-apt-repository ppa:ondrej/php
    apt-get update
    apt-get install -y php5.6
    apt-get install php5.6-dev

三、添加到系统公共库

执行以下命令,将库文件添加到系统公共库中。

    cp libmyclass1.so /usr/local/lib/      #拷贝到系统公共库
    cp libmyclass2.so /usr/local/lib/
    ldconfig                             #载入库

四、安装php扩展

下载php源码,使用源码包中的ext_skel工具创建扩展。

下载php源码

下载php当前版本对应的源码版本。使用以下命令查看当前php版本

    php -v

我的版本是7.0.21,到php官网下载对应的tar.gz文件

    wget http://php.net/distributions/php-7.0.21.tar.gz

解压并进入到ext目录

    tar -zxvf php-7.0.21.tar.gz
    cd php-7.0.21/ext

创建mythcrypt扩展

    ./ext_skel --extname=myclass1

更新config.m4文件,去掉第16和18行的dnl

    cd mythcrypt
    vim config.m4
   
    16:  PHP_ARG_ENABLE(myclass1, whether to enable mythcrypt support,
    17:  dnl Make sure that the comment is aligned:
    18:  [  --enable-myclass1           Enable myclass1 support])

更新myclass1.c

    vim myclass1.c

    // 添加函数声明
    const zend_function_entry myclass1_functions[] = {
        PHP_FE(confirm_myclass1_compiled,      NULL)           /* For testing, remove later. */
        PHP_FE(my_function,   NULL)
        PHP_FE(my_request,   NULL)
        PHP_FE_END      /* Must be the last line in mythcrypt_functions[] */
    };
   
    // 在PHP_FUNCTION(confirm_myclass1_compiled)函数定义下面添加如下代码。不同的版本添加的语法不一样,以下分别是5.3.10、5.6.31、7.0.21版本的示例。
   
    // 5.3.10
    PHP_FUNCTION(my_function)
    {
        char *ret;
   
        ret=my_function();
        RETURN_STRING(ret,0);
    }
    PHP_FUNCTION(my_request)
    {
        char *dataid;
        char *ret;
   
        .....;
    }
   
    // 5.6.31
    PHP_FUNCTION(my_function)
    {
        char dataout[1024]={0};
   
        my_function(dataout);
        RETURN_STRING(dataout, 1);
    }
    PHP_FUNCTION(my_request)
    {
        int datalen;
        char *dataid;
        char dataout[1024]={0};
   
        .....;
    }
   
    // 7.0.21
    PHP_FUNCTION(my_function)
    {
        char dataout[1024]={0};
   
        my_function(dataout);
        RETURN_STRING(dataout);
    }
    PHP_FUNCTION(my_request)
    {
        char *dataid;
        char dataout[1024]={0};
   
        .....;
    }

5.6.31 和 7.0.21版本中,函数my_function和my_request的返回字符串长度最大值是1024。

使用phpize命令生成configure文件

    phpize
    ./configure
    make LDFLAGS=-lmyclass1 # 载入libmycalss1.so并make
    make test                # 测试
    make install             # 将库安装到php的扩展文件夹里面

更新php配置文件,添加mythcrypt库

    vim /etc/php/7.0/apache2/php.ini

    extension=myclass1.so

    # 重启apache
    /etc/init.d/apache2 restart


五、编写测试脚本

测试脚本如下:

        echo my_function();
    echo my_request(1, '{"user_id":"test","crypto_service_id":1,"signature":"testasdfawef","data_in":{"sn":"A1000012312234234","hwid":"12312123234234234"}}');
   


你可能感兴趣的:(php,ubuntu)