文档章节

总结一下php5.2.16与apache2.0的C++扩展开发整个过程

ifeixiang
 ifeixiang
发布于 2014/10/31 17:48
字数 1148
阅读 15
收藏 0

开发环境:ubuntu 11(虚拟机环境) 开发平台: php-5.2.16.tar+apache2.0

PHP API 	20041225
PHP Extension 	20060613
Zend Extension 	220060519

说明一下为什么要用这么旧的版本,没原因,因为公司官方服务器是用这个版本...

之前用php5.3.10稳定版本已经做过一次,可是移植到php5.2.16上却用不了。发现原因应该是PHP与ZEND API不同!所以开发扩展时版本一定要一致啊! 一致的意思是:都是PHP5.2.X 或 PHP5.3.X 等等...

一:安装开发环境 如果用ubuntu自身的apt-get install 来安装apache与php的话不一定是你需要开发的版本!

所以还是要自己下载源代码编译安装。

关于编译安装的问题这篇文章帮了我很大的忙 http://wangyan.org/blog/install-php-from-source.html 步骤如下:

  1. 下载源代码,建立好文件夹解压 ,例如我解压在 /home/fei/phpex/apache ,/home/fei/phpex/php5.2.16
  2. 先安装apache,
    • cd httpd-2.2.17/
    • ./configure --prefix=/usr/local/apache
      (--prefix是安装到哪个目录,其他的就暂时不用了) 然后 make -> make install
    • 再配置apache : 将httpd 加入系统变量中,即直接编辑/etc/environment文件,或者新建软链接。建立软链接命令如下:
      ln -s /usr/local/apache/bin/httpd /usr/local/bin
    • 将apache加入开机自启动项:
      ln -s /usr/local/apache/bin/apachectl /etc/init.d/
                    update-rc.d apachectl defaults
      OK,下面可以用 httpd -k start(或restart)对apache服务器进行操作,至此,apache安装完。
  3. 再看PHP的安装:
    • cd php-5.2.16 
                ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs
      后面还有很多项都是不太需要的... 然后 make -> make install
    • 将Apache与PHP5联系起来,在些之前,需要将php5也加到系统的环境变量中 同样方法,建立软链接:
      ln -s /usr/local/php/bin/php /usr/local/bin
                 ln -s /usr/local/php/bin/phpize /usr/local/bin  (将phpize也加进去,等下要用)
      接下来设置apache的配置文件:/usr/local/apache/conf/httpd.conf 查找"AddType application/x-gzip .gz .tgz",在下面添加:
      AddType application/x-httpd-php .php
    • 到此,php与apache的连接完成,可以试一下 重启apache ,和运行 php -i

 

接下来开始我们真正的工作——开发PHP C++扩展 (以myext为例)

我们需要修改的就3个文件: config.m4 , myext.c , php_myext.h

  1. 进入到php源代码目录ext目录下, cd /home/fei/phpex/php-5.2.16/ext/ 运行:
    ./ext_skel --extname=myext
    ext目录下会生成一个myext的文件夹
  2. 修改 config.m4 文件,去掉这三行的dnl注释(搜索PHP_ARG_ENABLE)
    PHP_ARG_ENABLE(myext, whether to enable myext support,
            Make sure that the comment is aligned:
            [  --enable-myext           Enable myext support])
    再在最后面加上C++的库引用声明: (注意第二,三行,改成你自己的扩展的名字,大写,还有第五行)
    PHP_REQUIRE_CXX()
      PHP_SUBST(MYEXT_SHARED_LIBADD)
      PHP_ADD_LIBRARY_WITH_PATH(stdc++, "", MYEXT_SHARED_LIBADD)
      PHP_ADD_LIBRARY(stdc++,EXTRA_LDFLAGS)
      PHP_NEW_EXTENSION(, myext.cpp, $ext_shared)
  3. 将myext.c重命名为myext.cpp ,修改内容:
    #原代码 , 将下面的代码用extern C包含
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include "php.h"
    #include "php_ini.h"
    #include "ext/standard/info.h"
    
    #改为
    extern "C" {
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include "php.h"
    #include "php_ini.h"
    #include "ext/standard/info.h"
    }
    #include "php_matchCmd.h"
    
    # 这里可以自主加入你需要包含的文件,例如
    #include "link_file.cpp"

    添加前端使用的php函数接口,这里接口名字可以和扩展名字不一样;例如下面添加php_mytest函数:

    # 在zend_function_entry 数组里面添加我们的自定义函数
    zend_function_entry matchCmd_functions[] = {
        PHP_FE(php_mytest,NULL)    
        {NULL, NULL, NULL}    /* Must be the last line in matchCmd_functions[] */
    };

    在文件最后加入函数的实现

    PHP_FUNCTION(php_mytest)
    {
       //to get and store the arguments
            
        char *argv1= NULL ;
        char *argv2= NULL ; 
        int arg1_len, arg2_len; 
            
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &argv1, &arg1_len,&argv2,&arg2_len) == FAILURE) {
            return;
        }
        
        //php_printf("argv1 :%s\n",argv1);
        //php_printf("argv2 :%s\n",argv2);
        
        double dValue = func_from_link_file(argv1,argv2) ;
        RETURN_DOUBLE(dValue) ;
    }

     

  4. 在php_myext.h加入php的函数声明,和上面函数名一样
    PHP_MINIT_FUNCTION(myext);
    PHP_MSHUTDOWN_FUNCTION(myext);
    PHP_RINIT_FUNCTION(myext);
    PHP_RSHUTDOWN_FUNCTION(myext);
    PHP_MINFO_FUNCTION(myext);
    #在下面加入一行函数声明
    PHP_FUNCTION(php_mytest);

     

  5. 运行
    phpize  (后面可能用phpize --clean清理)
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make 
    make install

    如果提示没装autoconf,就apt-get install autoconf 装上 ,这里会提示你的扩展 .so文件在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/目录下,

  6. 接下来要配置php.ini文件。这里建议大家先写一个测试文件
    这样可以一目了然的看到加载的到底是哪个php.ini文件 配置php.ini主要就是加上两句,这里extension_dir可以加上,或者将.so文件移到你的扩展目录
    extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613"
    extension=myext.so
  7. 重启apache : httpd -k restart , 将myext文件夹下的myext.php(运行第一步命令时自动生成的)复制到www文件夹下
  8. 浏览即可看到模块加载的消息 。

© 著作权归作者所有

上一篇: dd测试硬盘性能
下一篇: Lua入门
ifeixiang
粉丝 16
博文 270
码字总数 99506
作品 0
广州
程序员
私信 提问
如何学习一门新的语言二——方法与步骤

之前发表过一篇文章,也是谈如何学习一门新的语言《如何学习一门新的语言》,这篇文章主要的关注点是心态。 今天这篇文章主要的关注点是具体的方法和步骤,是我学习C++和python的一些经验,整...

晨曦之光
2012/06/06
121
0
C、C++、Java、JavaScript、PHP、Python分别用来开发什么?

C、C++、Java、JavaScript、PHP、Python分别用来开发什么? 2018-05-25 11:47编辑: 游星啊分类:程序人生来源:代码湾 开发程序人生C 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发...

游星啊
2018/05/25
0
0
看一名 KDE 开发者如何使用 C++17 为项目提升巨大速度

参与 KDE 和 openSUSE 开发的开源项目开发者 Antonio Larrosa 一直在独立开发着一个名为 Bard 的命令行音乐管理器。他还写了一篇有趣的帖子来讲述他如何将这个软件中一些操作的速度提升了大约...

局长
2018/07/16
4.2K
16
是技术太次,还是要得太高。面试屡屡失败!

先来个背景介绍。 本人计算机科学与技术专业,C++方向,2013年毕业。非211,非985,但是在学校期间主攻技术,基础和知识面还是不错的。从C、C++、C#、java、php、Qt都有接触,数据库、多线程...

changnet
2015/04/25
2.6K
16
结合源码分析 Node.js 模块加载与运行原理

Node.js 的出现,让 JavaScript 脱离了浏览器的束缚,进入了广阔的服务端开发领域。而 Node.js 对 CommonJS 模块化规范的引入,则更是让 JavaScript成为了一门真正能够适应大型工程的语言。 ...

技术小能手
2018/08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
4
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
13
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部