zoukankan      html  css  js  c++  java
  • Ubuntu 下php调用c语言.so文件

    写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。

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

    /**
     * hello.c
     * To compile, use following commands:
     *   gcc -O -c -fPIC -o hello.o hello.c 
     *   gcc -shared -o libhello.so hello.o
     */
     
    int hello_add(int a, int b)
    {
        return a + b;
    }

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

    $ gcc -O -c -fPIC -o hello.o hello.c
    $ gcc -shared -o libhello.so hello.o
    $ su
    # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf  
    # cp libhello.so /usr/local/lib
    # /sbin/ldconfig

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

    /**
     * hellotest.c
     * To compile, use following commands:
     *   gcc -o hellotest -lhello hellotest.c
     */
    #include <stdio.h>
    int main()
    {
        int a = 3, b = 4;
        printf("%d + %d = %d
    ", a, b, hello_add(a,b));
        return0;
    }

    编译并执行:

    $ gcc -o hellotest -lhello hellotest.c
    $ ./hellotest
    3 + 4 = 7

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

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

    $ 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
    $ tar xzvf php-5.3.6.tar.gz
    $ cd php-5.3.6/ext

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

    $ ./ext_skel --extname=hello

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

    $ cd hello

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

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

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

    $ phpize5

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

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

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

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

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

    PHP_FUNCTION(hello_add)
    {
        longint a, b;
        longint result;
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
            return;
    }
        result = hello_add(a, b);
        RETURN_LONG(result);
    }

    保存退出,编译并安装:

    $ ./configure
    $ make LDFLAGS=-lhello
    $ sudo make install 此命令会将so放在php的扩展文件去

    编辑php的配置文件加载so

    $ ./configure
    $ vim /etc/php5/apache2/php.ini
    找到extension部分,加入extension=hello.so

     

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

    <?php
        echo hello_add(3, 4);
    ?>

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

  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/lizhangqu/p/4234549.html
Copyright © 2011-2022 走看看