• php调用so库和a库方法


    php调用so库和a库方法

    分类:

    • (一)调用so方法

    (引自:http://tech.idv2.com/2007/07/06/use-local-so-in-php/)

    某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。

    首先做一个简单的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));
        return 0;
    }

    编译并执行:

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

    OK,下面我们来制作PHP模块。首先确保你安装了 php-devel 包,没有的话请自行从安装光盘上找。然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。

    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)
    {
        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);
    }

    保存退出,编译并安装:

    $ ./configure
    $ make LDFLAGS=-lhello
    $ su
    # cp modules/hello.so /usr/lib/php/modules

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

    <?php
        dl("hello.so");
        echo hello_add(3, 4);
    ?>

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

    参考URL

    • 调用a库方法:

    (引自:http://group.qqread.com/thread-22305-1-1.html)

    把静态库加入PHP:
           把要编译的静态库链接存入环境变量。假设静态库的文件名叫libnpc.a,放在/home目录下。在PHP的安装目录下输入如下命令:export LDFLAGS=”–L/home –lnpc”
           这个环境变量的作用就是让PHP在编译时知道要把这个库也一起编译进去。

    编译PHP:
           和普通编译PHP没什么大区别,就是要在./configure的时候加上你的扩展,具体见编写PHP扩展部分。
           当编译好之后可以通过unset LDFLAGS来删除之前的环境变量。

    总结:

    动态库和静态库相同的地方就是上面橘色的地方,不同的地方so库是紫色的方法,而a库

    s#export LDFLAGS=”–L/home –lnpc”

    s#./configure

    s#make

    s#unset LDFLAGS

  • 相关阅读:
    毕业一年的广州之行
    js一个抽奖的例子
    关于position:absolute的困惑
    px,pt,em,rem
    HTML4.01和XHTML1.0和XHTML1.1的一些区别
    通过微信分享链接,后面会被加上from=singlemessage&isappinstalled=1可能导致网页打不开
    windows无提示关闭页面
    canvas画随机闪烁的星星
    angular背景图片问题
    Python爬虫(二)— Python3内置模块 Urllib
  • 原文地址:https://www.cnblogs.com/shsgl/p/4313401.html
Copyright © 2020-2023  润新知