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

开发环境: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安装完。
再看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/binln -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 argumentschar *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文件夹下 浏览即可看到模块加载的消息 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP ---封装与分用

封装 当应用程序用T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图1 - 7所示。T C P传给I P的数…

深入了解crc32算法

From: http://blog.csdn.net/isadream/article/details/2072760 由于项目需要,解决一个流媒体文件的crc32校验码。网上查了很多的资料,发现了此校验码和生成多项式以及算法本身都有关系。对于不同类型的文件所使用的多项式以及算法不同,对于不…

React开发(271):UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated e

原因:没有进行promise的差错处理 解决方案:加一个catch语句 .catch(err > {console.log(err);})

远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助...

故障:“远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助” 故障症状:当您使用Windows XP“远程桌面连接”工具去连接Windows Vistas或Windows Server 2008的远程桌面、终端…

CRC32算法详细推导(1)

From: http://blog.csdn.net/sparkliang/article/details/5671510 CRC算法详解(1) 作为blog再次发出来,详细描述一下CRC32算法的推导过程。 CRC 算法的数学基础 CRC 算法的数学基础就不再多啰嗦了,到处都是,简单提一…

前端javascript面试题目录汇总

【JS】 [js] 请使用js实现一个秒表计时器的程序 [js] 模拟 localStorage 时如何实现过期时间功能 [js] 请使用js实现商品的自由组合,并说说你的思路 [js] js中的undefined和 ReferenceError: xxx is not defined 有什么区别? [js]JavaScript Number…

React开发(272):try...catch..捕获

//通过接口获取listhandleSearchList async (url) > {try {const res await url();if (res.data && res.data.length > 0) {this.setState({thirdList: res.data,showThird: true,tabName: ,});}} catch (error) {}};

CRC32算法详细推导(2)

From: http://blog.csdn.net/sparkliang/article/details/5671977 CRC算法详解(2) 初见 Table-Driven 变换到上面的方法后,我们离 table-driven 的方法只有一步之遥了,我们知道一个字节能表示的正整数范围是 0~255,步…

iOS UIWebView加载网页、文件、HTML

UIWebView是用来加载加载网页数据的一个框架.UIWebView可以用来加载pdf,word,doc,等等文件,生成webview 有两种方法,1、通过storyboard 拖拽 2、通过alloc init 来初始化创建webview,下列文本中 _webView.dataDetectorTypes UIDataDetectorTypeAll; 是识…

nginx的upstream模块安装

下载连接:wget http://code.google.com/p/nginx-upstream-jvm-route/downloads/detail?namenginx-upstream-jvm-route-0.2.tar.gz&can1&q/nginx-upstream-jvm-route-0.2.tar.gz nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于…

前端面试题Vue-cli目录汇总

【Vue-cli】 [vue-cli]vue-cli3你有使用过吗?它和2.x版本有什么区别? [vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢 [vue-cli]不用vue-cli,你自己有搭建过vue的开发环境吗?流程是什么? [v…

CRC32算法详细推导(3)

From:http://blog.csdn.net/sparkliang/article/details/5671543 CRC32算法详细推导(3) 郁闷的位逆转 看起来我们已经得到 CRC-32 算法的最终形式了,可是、可是在实际的应用中,数据传输时是低位先行的;对于一个字节 …

WebService的学习

这篇文章不错,直接转了 http://blog.csdn.net/terryzero/article/details/5976638#comments 转载于:https://www.cnblogs.com/zhilu-doc/p/5291927.html

linux 用户行为审计

根据公司需求,整理了一个linux用户审计的脚本,现和大家分享! 具体步骤如下: 一:配置调试 1.创建用户审计文件存放目录和审计日志文件 ; mkdir -p /var/log/usermonitor/ 2.创建用户审计日志文件&#xff1…

前端面试题vue-element汇总

【Vue-element】 [vue-element] ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢? [vue-element] 你有二次封装过ElementUI组件吗? [vue-element] ElementUI怎么修改组件的默认样式? [vue-element]ElementUI的穿…

每天一点Swift(五)控制器的生命周期和SizeClass

字数358 阅读19 评论0 喜欢0 初始化init-->awakeFromNib--> prepare a segue --> SB去设置outlets --> viewDidLoad 1. viewDidLoad 在viewDidLoad中,outlets已经被设置;但是几何位置(bounds)并没有被设置 viewDidLoa…

h264 I帧的判断

From:http://blog.csdn.net/dxpqxb/article/details/13289205 H264数据的NALU 头的格式如图2 所示: F:forbidden_zero_bit.1 位,如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便…

前端面试题node.js汇总

【NodeJs】 [NodeJs] 你有使用过npx吗?它主要解决什么问题? [NodeJs] 如何使用nodejs对base64进行编解码? [NodeJs] npm提供了哪些钩子?各有什么作用? [NodeJs] 如果发现node_modules中有个模块代码有bug&#xff…

win10 下安装、配置、启动mysql

1、下载http://dev.mysql.com/downloads/mysql/ 2、Community > MySQL Community Server 3、Other Downloads: > Windows (x86, 32-bit), ZIP Archive 5、解压mysql-5.7.11-winx64.zip,解压在 D:\soft\mysql-5.7.11-winx64\mysql-5.7.11-winx64 6、在D:\soft\…

成功驱动HD4600-Clover引导

本人机器配置如下: 操作系统 Windows 7 旗舰版 64位 SP1 ( DirectX 11 ) 处理器 英特尔 Core i7-4770K 3.50GHz 四核 核显: Intel HD4600 主板 华硕 Z87-PRO (英特尔 Haswell) 内存 8 GB ( 金士顿 DDR3 1778MH…