博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
总结一下php5.2.16与apache2.0的C++扩展开发整个过程
阅读量:6247 次
发布时间:2019-06-22

本文共 3823 字,大约阅读时间需要 12 分钟。

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

PHP API 	20041225PHP Extension 	20060613Zend Extension 	220060519

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

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

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

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

关于编译安装的问题这篇文章帮了我很大的忙 步骤如下:

  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安装完。
再看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-configmake 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文件夹下 浏览即可看到模块加载的消息 。

转载地址:http://haria.baihongyu.com/

你可能感兴趣的文章
Scala程序设计读书笔记[1:5]
查看>>
概率论快速学习05:随机变量 二项分布 泊松分布
查看>>
构建Tiny生态圈
查看>>
【vnc】vncserver: couldn't find "xauth" on your PATH 问题
查看>>
扩大Ubuntu的空间
查看>>
Mahout驾驭hadoop之详解
查看>>
java泛型【收藏】
查看>>
Spring Boot自动配置
查看>>
lambda表达式-编译测试
查看>>
Java I/O : Bit Operation 位运算
查看>>
绘制虚线的UIView
查看>>
【Oracle】oracle的LAG和LEAD分析函数
查看>>
HDU 1006 Tick and Tick 时钟指针问题
查看>>
C编程常见问题总结
查看>>
使用最新版SDWebImage
查看>>
数据仓库专题(5)-如何构建主题域模型原则之站在巨人的肩上(二)NCR FS-LDM主题域模型划分...
查看>>
数据仓库3NF基础理论和实例
查看>>
backsolve & fowardsolve 解特殊方程 (上三角或下三角系数为0的方程)
查看>>
android数据绑定框架介绍
查看>>
Oracle SQL : delete from (query), delete which table's row?
查看>>