当前位置: 首页 > 图文教程 > 网络编程 > PHP > linux下php实现C/C++扩展编程

PHP
php 多线程上下文中安全写文件实现代码
PHP类的使用 实例代码讲解
用php实现让页面只能被百度gogole蜘蛛访问的方法
php 学习笔记
PHP编程过程中需要了解的this,self,parent的区别
php 操作excel文件的方法小结
使用PHP获取网络文件的实现代码
PHP 巧用数组降低程序的时间复杂度
php下将XML转换为数组
php 文件上传代码(限制jpg文件)
php 无极分类(递归)实现代码
PHP 采集获取指定网址的内容
PHP 将图片按创建时间进行分类存储的实现代码
PHP 存储文本换行实现方法
PHP 批量更新网页内容实现代码
用PHP查询搜索引擎排名位置的代码
用php实现的获取网页中的图片并保存到本地的代码
php实现首页链接查询 友情链接检查的代码
处理php自动反斜杠的函数代码
php实现的遍历文件夹下所有文件,编辑删除

PHP 中的 linux下php实现C/C++扩展编程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 167 ::
收藏到网摘: n/a

某个功能被编译到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\n", a, b, hello_add(a,b));
        return 0;
    }

    编译并执行:

    $ gcc -o hellotest -lhello hellotest.c

    $ ./hellotest

    3 + 4 = 7OK,

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

    $ tar xzvf php-5.2.9.tar.gz

    $ cd php-5.2.9/ext然后通过下面的命令建立一个名为 test 的模块。

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

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

    16:  PHP_ARG_ENABLE(test, whether to enable test support,
    17:  dnl Make sure that the comment is aligned:
    18:  [  --enable-test           Enable test support])然后执行 phpize ()程序,生成configure脚本:

 $ phpize然后打开 php_test.h,在 PHP_FUNCTION(confirm_test_compiled); 之下加入函数声明:

    PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
    PHP_FUNCTION(test_add);打开 hello.c,在 PHP_FE(confirm_test_compiled, NULL) 下方加入以下内容。
    zend_function_entry test_functions[] = {
        PHP_FE(confirm_test_compiled,  NULL)       /* For testing, remove later. */
        PHP_FE(test_add,   NULL)       /* For testing, remove later. */
        {NULL, NULL, NULL}  /* Must be the last line in test_functions[] */
    };

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

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

    保存退出,编译并安装:

    $ ./configure --enable-jinzhesheng_module --with-apxs=/usr/local/apache/bin/apxs --with-php-config=/usr/local/php/bin/php-config$ make

    # cp modules/test.so /usr/lib/php/modules然后在 /www/web/ 下建立一个 test.php 文件,内容如下:

    <?php
        dl("test.so");
        echo test_add(1, 2);
    ?>

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