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

某个功能被编译到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,则说明函数调用成功了。

时间: 2024-09-30 08:54:33

linux下php实现C/C++扩展编程的相关文章

Linux下编译安装php libevent扩展实例

 这篇文章主要介绍了Linux下编译安装php libevent扩展实例,本文着重讲解了编译过程中一个错误解决方法,需要的朋友可以参考下     原本想尝试一下PHP编写高性能网络服务,需要安装libevent扩展,没想到让人很费了点脑袋 先下载libevent扩展: http://pecl.php.net/package/libevent 解压后,开始编译 代码如下: $ cd libevent-version $ /usr/local/php/bin/phpize $ ./configure

linux下基于C语言的信号编程实例_C 语言

本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

Linux下手动编译安装PHP扩展的例子分享_php实例

开发和部署的过程中可能会经常出现需要额外安装PHP扩展的情况,下边以PDO_MYSQL为例,介绍下手动编译安装PHP扩展: 先到http://pecl.php.net/找需要的版本,我用的是稳定的版本.要先看看说明,特别是要注意mysql的php的版本. 复制代码 代码如下: wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz tar xzvf PDO_MYSQL-1.0.2.tgz cd PDO_MYSQL-1.0.2 /usr/local/php

深入分析Linux下如何对C语言进行编程_C 语言

1.源程序的编译    在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c):  int main(int argc,char **argv)  {printf("Hello Linux/n");  } 要编译这个程序,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello

Linux下swap分区过小 手动扩展swap分区的方法

一 问题描述: 在Linux系统下安装Oracle 10g时发现swap分区过小的情况,需要手动去扩展swap分区的大小. 二 解决方法: 2.1 创建分区 以下的操作都要在root用户下进行,首先先建立一个分区,采用dd命令比如 dd if=/dev/zero of=/home/swap bs=1024 count=1024000 这样就会创建/home/swap这么一个分区文件.文件的大小是1024000个block,一般情况下1个block为1K,所以这里空间是1024M. 2.2 指定分

Linux下安装PHP的lua扩展库

  一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-5.3.4.tar.gz tar xvf lua-5.3.4.tar.gz cd lua-5.3.4 重要:进入解压缩后的路径 cd .../lua-5.3.4/src 打开Makefile文件 在CFLAG一行 添加选项 -fPIC 像这样: 找到源文件的这行替换掉 CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) -fPIC $(MYCFLAGS) 然后编

Linux下编译安装php libevent扩展实例_javascript技巧

原本想尝试一下PHP编写高性能网络服务,需要安装libevent扩展,没想到让人很费了点脑袋 先下载libevent扩展: http://pecl.php.net/package/libevent 解压后,开始编译 复制代码 代码如下: $ cd libevent-version $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config 结果马上报错了,错误显示为re2c版本

linux下 C语言对 php 扩展_php技巧

一,搭建php环境下载php 5.2.6 源码 并解压编译安装,搭建php环境二,创建扩展项目进入源码目录cd php5.2.6/ext/./ext_skel --extname=my_ext创建名字为my_ext的项目,最终会生成my_ext.so 三,更改配置和程序$ vi ext/my_ext/config.m4 根据你自己的选择将 dnl PHP_ARG_WITH(my_ext, for my_ext support,dnl Make sure that the comment is a

Linux下串口编程入门

简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍.   串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定