使用C++开发PHP扩展
目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案。当然“如何开发PHP扩展”的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的介绍。C++编程语言功能的强大,促使好多公司后台程序选择使用它,因此碰到的大多数情况是需要我们用C++来扩展 PHP。PHP源码中的扩展骨架工具,默认生成的是支持 C 语言,如果要使用C++开发,有些参数需要另行配置。下面将用一个简单的示例来说明。
准备工作:
1. 下载PHP源码 http://www.php.net/downloads,这里下载到的是 php-5.3.24.tar.gz
2. 解压后,源码放到 /root/php-5.3.24/
3. 安装目录:/usr/local/php-5.3.24/
4. 开始安装,配置 php.ini 的路径,方便以后进行个性化配置
5. 扩展名称:discuz
6. 扩展函数:discuz_say(),这个函数只返回一个“Hello world!” 字符串
7. 扩展可运行在 win32 系统,也运行在类unix系统,但是需要编译不同的文件,这里只介绍 GNU/Linux 下的操作。
开始编写扩展:
1. 创建要实现的函数列表文件 discuz.proto,内容如下:
string discuz_say()
2. 使用扩展骨架工具生成核心文件,命令如下:
[root@localhost ~]# cd php-5.3.24/ext/
[root@localhost ext]# ./ext_skel --extname=discuz --proto=../../discuz.proto
这时就在 ext 目录下出现了 discuz 文件夹,里面包含几个文件,如:config.m4 discuz.c php_discuz.h 等等。
3. 修改config.m4文件,内容如下:
dnl $Id$
dnl config.m4 for extension discuz PHP_ARG_ENABLE(discuz, whether to enable discuz support,
Make sure that the comment is aligned:
[ --enable-discuz Enable discuz support]) if test "$PHP_DISCUZ" != "no"; then
PHP_REQUIRE_CXX() dnl 通知Make使用g++
PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS) dnl 加入C++标准库 PHP_NEW_EXTENSION(discuz, discuz.cpp, $ext_shared)
fi
这个文件中 dnl 是注释符,其之后的字串是解释上下文。
4. 修改 discuz.c 文件重名为 discuz.cpp(这样命名看起来更专业)
4.1 加入需要的C++ string 头文件,如下:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif #include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_discuz.h" #include <string> /* 添加这行 */
4.2 修改 discuz_say 函数,如下:
/* {{{ proto string discuz_say()
*/
PHP_FUNCTION(discuz_say)
{
std::string str = "Hello world!";
RETURN_STRINGL(str.c_str(), str.length(), 1);
}
5. 编译扩展,把其 discuz.so 放到安装目录(可以参考 编译PHP扩展的两种方式)。
开始测试:
<?php
echo discuz_say() . "\n";
?>
[root@localhost ~]# /usr/local/php-5.3.24/bin/php hi.php
Hello world!
到此,一个简单的扩展就完成了
来源:python脚本自动迁移
使用C++开发PHP扩展的更多相关文章
- 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...
- Sublime Text 前端开发常用扩展插件推荐
Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...
- 【翻译】我钟爱的Visual Studio前端开发工具/扩展
原文:[翻译]我钟爱的Visual Studio前端开发工具/扩展 怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾
前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...
- 手把手教你开发chrome扩展
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...
- 【逆向知识】开发WinDBG扩展DLL
如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- windows下开发PHP扩展dll(无需Cygwin)
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
随机推荐
- 懂得三境界-使用dubbo时请求超过问题
引子 刚才下班回家路上,无意中听到大街上放的歌,歌词有这么一句:"毡房外又有驼铃声声响起,我知道那一定不是你".这一句我似乎听懂了歌者的魂牵梦绕和绝望,如果在十年前我大概只能感受出 ...
- MongoDB备份与恢复操作
1. 备份和恢复工具参数 * 几个重要参数: * mongodump * --polog:复制mongodump开始到结束过程中的所有oplog并输出到结果中.输出文件位于dump/oplog.bso ...
- JdbcTemplate 基本使用
简介 JdbcTemplate 是 Spring 对 JDBC 的封装,目的是使 JDBC 更加易于使用.JdbcTemplate 是 Spring 的一部分.JdbcTemplate 处理了资源的建 ...
- python 面向对象:多态和多态性
很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗. 一.多态 多态指的是一类事物有多种形态.(一个抽象类有多个子类,因而多态的概念依赖于继承) 比如动物有多种形态:人 ...
- Java 递归 常见24道题目 总结
1.N个台阶的走法递归[这里设为10个台阶] /** * N个台阶的走法递归 * <p> * 有个楼梯,台阶有10个,每次可以跳上1阶 或者 2阶 ,那么台阶的走法一共有多少种 */ @T ...
- spring boot + spring security +JWT令牌 +前后端分离--- 心得
1.前言 观看这篇随笔需要有spring security基础. 心得: 1.生成token 的变化数据是用户名和权限拼接的字符串 ,其他的固定 2.生成的token是将登录通过的用户的权限拼接的字符 ...
- springboot插件打包跳过单元测试
只需在pom.xml添加如下即可 <skipTests>true</skipTests> pom文件如下 <?xml version="1.0" en ...
- 【基因组学】maker的安装和注释
本文默认读者有一定的生信基础,没有基础的可以阅读以前的笔记内容. maker作为比较受人认可的基因组注释软件,其流程较为清晰简单. 不知何故,我的conda无法安装maker,故而采用手动安装方式. ...
- SYCOJ2205超级百钱百鸡
题目-超级百钱百鸡 (shiyancang.cn) 百钱百鸡的加强版 百钱百鸡的话,因为是有范围,所以挨个挨个尝试即可,确定两个,即可确定第三个. 超级百钱百鸡,通过题目的描述,最后可以得到一个二元的 ...
- KMP算法解题模板(更新)
/* kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板 性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len] 性质2:kmp的next不断向 ...