php扩展开发-快速上手
系统环境CentOS release 6.5 (Final)
PHP版本php-5.6.27
扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/study/php5627/,源码目录/home/zhangxiaomin/study/php-5.6.27,
ln -s /home/zhangxiaomin/study/php5627/bin/php /home/zhangxiaomin/bin/php5.6 做一个软连接用php5.6代替/home/zhangxiaomin/study/php5627/bin/php
在源码目录ext下新建myext目录,本次开发的扩展所有代码都放在该目录下[/home/zhangxiaomin/study/php-5.6.27/ext/myext],你需要记住这3个目录,后续我们会频繁用到。如果你是刚开始学习扩展,我建议你弄一个和我一样的目录,虽然这看起来有点傻,但是它可以最好的保证你顺利的编译完成,等你熟悉了整个流程之后,你可以按照自己的习惯规划自己的扩展目录,如果你就想自己安排目录,也没有问题,记得在整个的扩展开发过程中,替换掉所有的目录路径,换成你自己的。
首先通过一个简单的项目,让你快速构建自己的一个扩展,有一个直观的感受,然后我们再一步步抽丝剥茧深入其中的每一个知识点,在这个过程中,你很多不太理解,没有关系,你可以先照着做。
创建config.m4文件,该文件告诉 UNIX 构建系统哪些扩展 configure 选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。具体参见http://www.php.net/manual/zh/internals2.buildsys.configunix.php
PHP_ARG_ENABLE(myext, whether to enable Myext support,
[ --enable-myext Enable Myext support])
if test "$PHP_MYEXT" = "yes"; then
PHP_SUBST(MYEXT_SHARED_LIBADD)
PHP_NEW_EXTENSION(myext, myext.c, $ext_shared)
fi
上面PHP_ARG_ENABLE函数有三个参数,第一个参数是我们的扩展名(不用加引号),第二个参数是当我们运行./configure脚本时显示的内容,最后一个参数则是我们在调用./configure --help时显示的帮助信息。
3行表示当你编译php时如果加上--enable-myext则加载本扩展
4行是固定语法,大写扩展名_SHARED_LIBADD[MYEXT_SHARED_LIBADD]
5行 PHP_NEW_EXTENSION(myext, myext.c, $ext_shared) 第一个参数是扩展名,第二个参数则是扩展的C代码文件,多个文件用空格隔开,比如myext.c myext2.c myext3.c ,第三个参数是固定语法,加上就可以了。
创建php_myext.h文件
#ifndef PHP_MYEXT_H //常规用法,解决重复require
#define PHP_MYEXT_H
#define PHP_MYEXT_VERSION "1.0" //定义版本常量
#define PHP_MYEXT_EXTNAME "myext" //定义扩展常量 PHP_FUNCTION(myext_hello);//函数申明,所有在myext.c文件定义的函数,都会在这个文件里有一个申明 extern zend_module_entry myext_module_entry;//申明模块注册变量,在myext.c定义
#define phpext_myext_ptr &myext_module_entry #endif
创建myext.c
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"//有了这个才能进行扩展开发,Zend的底层类库
#include "php_myext.h"//我们自己定义的头文件 /*{{{
*
* */
static zend_function_entry myext_functions[] = {
PHP_FE(myext_hello, NULL)//每个函数一行,第一个参数与PHP_FUNCTION(name)的name一样
{NULL, NULL, NULL}//固定语法
};
/*}}}*/ /*{{{定义扩展模块相关
* */
zend_module_entry myext_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"myext",//扩展名称
myext_functions,//zend_function_entry myext_functions 定义好的函数扩展变量
NULL,//MINIT_FUNCTION
NULL,//MSHUTDOWN_FUNCTION
NULL,//RINIT_FUNCTION
NULL,//RSHUTDOWN_FUNCTION
NULL,//MINFO_FUNCTION
#if ZEND_MODULE_API_NO >= 20010901
PHP_MYEXT_VERSION,
#endif
STANDARD_MODULE_PROPERTIES
};
/*}}}*/ /*{{{
*没有这个就不能在php.ini里面动态加载so
* */
#ifdef COMPILE_DL_MYEXT
ZEND_GET_MODULE(myext)
#endif
/*}}}*/ PHP_FUNCTION(myext_hello)
{
php_printf("hello you are success");
}
现在在你的myext目录下,应该有三个文件,config.m4 myext.c php_myext.h 接着我们开始编译扩展。
1,/home/zhangxiaomin/study/php5627/bin/phpize 用phpize的工具帮助我们生成各种配置模板文件
2,/home/zhangxiaomin/study/php-5.6.27/ext/myext/configure --with-php-config=/home/zhangxiaomin/study/php5627/bin/php-config 生成makefile文件
3,make
4,make test
5,make install 如果不是少了类库少了权限执行路径不对的话,你应该能顺利看到这句话 Installing shared extensions: /home/zhangxiaomin/study/php5627/lib/php/extensions/debug-zts-20131226/ 这就表示我们的扩展库已经编译完成了,接着需要把编译生成的myext.so的库加到php.ini中去
6,cp -rpf /home/zhangxiaomin/study/php-5.6.27/php.ini-development /home/zhangxiaomin/study/php5627/lib/php.ini 复制一份php.ini文件
7,编辑/home/zhangxiaomin/study/php5627/lib/php.ini文件
;搜索extension_dir做以下修改
extension_dir = "/home/zhangxiaomin/study/php5627/lib/php/extensions/debug-zts-20131226/" ;在文件末尾添加以下部分
[myext]
extension=myext.so
8,php5.6 -m | grep myext 检测扩展是否成功安装,如果你看到了myext,那恭喜你。
9,在/home/zhangxiaomin/study/php-5.6.27/ext/myext/目录下新建一个test.php的文件,用来运行我们编写的扩展的函数。
<?php
myext_hello();
10,php5.6 test.php //hello you are success
至此我们的扩展安装完成了,尽管它看起来很简单,也没有实际作用,只有一个myext_hello的函数,但是我们已经把扩展开发的流程和框架搭建起来了,我们可以在这个基础上增加各种我们想要的功能。
php扩展开发-快速上手的更多相关文章
- Netron开发快速上手(二):Netron序列化
Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...
- Netron开发快速上手(一):GraphControl,Shape,Connector和Connection
版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...
- Java开发快速上手
Java开发快速上手 前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 ...
- PhalApi 2.7 开发快速上手
PhalApi是一款国人制作的PHP纯后端框架.它的开发相当简单,同时也具备文档生成等特色功能.下面,我通过简单的几点,让你可以快速入门使用该框架的开发. 建议使用PHPStorm作为IDE,代码提示 ...
- 前端开发工具包 WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
前端开发工具包WijmoJS在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线Demo系统.各控件新增功能.NPM 包的改动,以及全新的浏览器API组件. WijmoJ ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中
如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...
- 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建
目录 0.引言 1.什么是Visual Studio项目模板 2.IWizad接口 3.通过Visual Studio扩展开发实现领域驱动开发 3.1 使用VSIX+ProjectTemplate创建 ...
随机推荐
- poj3233(矩阵快速幂的和)
题目链接:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K T ...
- select 下拉框的复选
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAAFSCAIAAAArbtLAAAAgAElEQVR4nOydd1gUWaK3Z2/YvXd3v7 ...
- android 开发AlertDialog.builder对话框的实现
AndroidAPI提供了Dialog对话框控件,但google明确指出不建议开发者只是使用Dialog来创建对话框,而应该自定义对话框或者使用API中提供的Dialog的子类,如AlertDialo ...
- linux安装jdk7步骤
linux安装jdk7步骤: 1.首先使用命令查看linux系统版本号: lsb_release -a 2.下载对应的jdk版本,笔者使用的是jdk-7u79-linux-x64.tar.gz: 3. ...
- .net 中的托管与非托管
托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assemb ...
- 19.CentOS7下PostgreSQL安装过程
CentOS7下PostgreSQL安装过程 装包 sudo yum install postgresql-server postgresql-contrib 说明: 这种方式直接明了,其他方法也可以 ...
- html 02-认识html
1. HTML 初识 HTML 指的是超文本标记语言 (Hyper Text Markup Language)是用来描述网页的一种语言. HTML 不是一种编程语言,而是一种标记语言 (markup ...
- Android 关于Acitivity 的setFlag以及launchmode的总结
Intent几种常见的flags: .FLAG_ACTIVITY_NEW_TASK:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Acti ...
- JAVA方法定义和调用
类的方法代表的是实例的某种行为或功能 定义类的方法 访问修饰 类型 方法名(参数列表){ //方法体 } 1.把方法当作一个模块,是个“黑匣子”,完成某个特定的功能,并返回处理结果 2.方法分类“ 返 ...
- 日常入新坑,py一下
首先是IDE,因为我经常在Ubuntu 18和win 10两个系统换来换去,所以IDE必须要能跨平台,所以这里就选了PyCharm.Py划重点—— 从Jet Brains的网站下载安装包,直接跟着默认 ...