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

PHP
PHP 执行系统外部命令 system() exec() passthru()
最新的php 文件上传模型,支持多文件上传
php 静态页面中显示动态内容
数据库查询记录php 多行多列显示
谈PHP生成静态页面分析 模板+缓存+写文件
PHP 各种排序算法实现代码
PHP nl2br函数 将换行字符转成 <br>
php 分页原理详解
Discuz 模板语句分析及知识技巧
php win下Socket方式发邮件类
怎样去阅读一份php源代码
建站常用13种PHP开源CMS比较
php xml留言板 xml存储数据的简单例子
PHP 开源AJAX框架14种
PHP 替换模板变量实现步骤
PHP has encountered an Access Violation at 7C94BD02解决方法
php 正则匹配函数体
php 文件夹删除、php清除缓存程序
php download.php实现代码 跳转到下载文件(response.redirect)
PHP类(Class)入门教程

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 245 ::
收藏到网摘: 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,则说明函数调用成功了。