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

1 PHP_ARG_ENABLE(myext, whether to enable Myext support,
2 [ --enable-myext Enable Myext support])
3 if test "$PHP_MYEXT" = "yes"; then
4   PHP_SUBST(MYEXT_SHARED_LIBADD)
5   PHP_NEW_EXTENSION(myext, myext.c, $ext_shared)
6 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文件

 1 #ifndef PHP_MYEXT_H //常规用法,解决重复require
 2 #define PHP_MYEXT_H
 3 #define PHP_MYEXT_VERSION "1.0" //定义版本常量
 4 #define PHP_MYEXT_EXTNAME "myext" //定义扩展常量
 5
 6 PHP_FUNCTION(myext_hello);//函数申明,所有在myext.c文件定义的函数,都会在这个文件里有一个申明
 7
 8 extern zend_module_entry myext_module_entry;//申明模块注册变量,在myext.c定义
 9 #define phpext_myext_ptr &myext_module_entry
10
11 #endif

创建myext.c

 1 #ifdef HAVE_CONFIG_H
 2 #include "config.h"
 3 #endif
 4 #include "php.h"//有了这个才能进行扩展开发,Zend的底层类库
 5 #include "php_myext.h"//我们自己定义的头文件
 6
 7 /*{{{
 8  *
 9  * */
10 static zend_function_entry myext_functions[] = {
11     PHP_FE(myext_hello, NULL)//每个函数一行,第一个参数与PHP_FUNCTION(name)的name一样
12     {NULL, NULL, NULL}//固定语法
13 };
14 /*}}}*/
15
16 /*{{{定义扩展模块相关
17  * */
18 zend_module_entry myext_module_entry = {
19 #if ZEND_MODULE_API_NO >= 20010901
20     STANDARD_MODULE_HEADER,
21 #endif
22     "myext",//扩展名称
23     myext_functions,//zend_function_entry myext_functions 定义好的函数扩展变量
24     NULL,//MINIT_FUNCTION
25     NULL,//MSHUTDOWN_FUNCTION
26     NULL,//RINIT_FUNCTION
27     NULL,//RSHUTDOWN_FUNCTION
28     NULL,//MINFO_FUNCTION
29 #if ZEND_MODULE_API_NO >= 20010901
30     PHP_MYEXT_VERSION,
31 #endif
32     STANDARD_MODULE_PROPERTIES
33 };
34 /*}}}*/
35
36 /*{{{
37  *没有这个就不能在php.ini里面动态加载so
38  * */
39 #ifdef COMPILE_DL_MYEXT
40 ZEND_GET_MODULE(myext)
41 #endif
42 /*}}}*/
43
44 PHP_FUNCTION(myext_hello)
45 {
46     php_printf("hello you are success");
47 }

现在在你的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文件

1 ;搜索extension_dir做以下修改
2 extension_dir = "/home/zhangxiaomin/study/php5627/lib/php/extensions/debug-zts-20131226/"
3
4 ;在文件末尾添加以下部分
5 [myext]
6 extension=myext.so

8,php5.6 -m | grep myext 检测扩展是否成功安装,如果你看到了myext,那恭喜你。

9,在/home/zhangxiaomin/study/php-5.6.27/ext/myext/目录下新建一个test.php的文件,用来运行我们编写的扩展的函数。

1 <?php
2 myext_hello();

10,php5.6 test.php //hello you are success

至此我们的扩展安装完成了,尽管它看起来很简单,也没有实际作用,只有一个myext_hello的函数,但是我们已经把扩展开发的流程和框架搭建起来了,我们可以在这个基础上增加各种我们想要的功能。

时间: 2024-09-30 06:47:10

php扩展开发-快速上手的相关文章

Netron开发快速上手(二):Netron序列化

Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用Netron开发的实际应用请看:发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart 一.      Netron对象序列化 序列化Netron对象需要以下几个步骤: 添加序列化标签]Serializable] [Serializable] public class BlockSh

PhalApi 2.7 开发快速上手

PhalApi是一款国人制作的PHP纯后端框架.它的开发相当简单,同时也具备文档生成等特色功能.下面,我通过简单的几点,让你可以快速入门使用该框架的开发. 建议使用PHPStorm作为IDE,代码提示相当完全.由于PHP的热更新特性,修改过的PHP文件保存后立即生效,无需编译,无需重启服务器. 什么是PhalApi PhalApi是一个轻量级的PHP接口框架.有别于传统的框架,它只面向后端接口的开发. 官网:https://www.phalapi.net 官方文档:http://docs.pha

Netron开发快速上手(上)

版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一.      概述 Netron是一个开源的图形开发库,它还有一个轻量级的版本叫NetronLight,本文不讨论NetronLight. 在NetronGraphLib里,需要重点理解的是四个类,这四个类理解了,NetonGraphLib就掌握了大半部分: GraphControl:代表的是画布对象,所有的图形

Swift开发快速上手系列教程目录-陆续完善,由浅入深

Swift开发教程 一.Swift基础 Swift教程01-使用switfc终端命令编译运行swift程序 Swift教程02-抓住下一个浪潮之巅 Swift教程03-playground剖析swift语言 Swift教程04-定义声明变量重要原则 Swift教程05-基本数据类型(一)整型浮点型 Swift教程06-基本数据类型(二)Bool布尔类型对比Java-boolean,Objc-BOOL Swift教程07-基本数据类型(三)元组类型tuple Swift教程08-基本数据类型(四)

Java开发快速上手

前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 如何搭建Java运行环境 1.2.1 了解JDK与JRE 1.2.2 jdk下载与安装 1.2.3 配置开发环境 1.3 如何写Java代码 1.3.1 我的第一个Java程序 1.5 注解的使用 1.6 思维导图 第二章 变量_常量_运算符 2.1 什么是变量 2.1.2 如何声明变量 2.1.3 变量名的命名规则 2

FastAdmin模块开发快速上手

下载FASTADMIN地址: https://www.fastadmin.net/download.html FASTADMIN开发文档地址:https://doc.fastadmin.net/docs/index.html fastAdmin   https://www.jianshu.com/search?q=FastAdmin&page=1&type=note 例子: 第一步: 在数据库中创建一个hysj_member用户列表 表结构如下: 注意: 1.用户名字段必须唯一,不能重复(

Extjs视频教程_快速上手Extjs4.2实战开发

Extjs视频教程_快速上手Extjs4.2实战开发快速上手Extjs4.2并熟练搭建基于MVC4+FluentData+Spring.net和T4模板的企业级项目架构适合人群:中级课程分类:.NET+ExtJs课时数量:76课时用到技术:Extjs4.2,MVC4,FluentData,T4,Spring.net涉及项目:基于Extjs4.2的丰富案例.一个独立的企业级架构和综合演示案例咨询qq:1840215592 Extjs视频教程课程大纲:(1)Extjs4.2理论部分(风舞烟老师老师主

android快速上手(二)android开发环境搭建及hello world

基本了解了java语法,下一步,我们一起开启hello world的神秘之旅. (一)android开发环境搭建 之前搭建android开发环境是件非常费力的事情,下载Eclipse,安装ADT等,如今android官方给我们提供了全套配置. https://developer.android.com/sdk/index.html 搭建android开发环境之前记得先安装jdk (二)开启Hello World之旅 (1)创建Hello World项目 安装完带ADT的Eclipse,打开Ecl

快速上手Ionic3 多平台开发企业级问答社区

详情请交流  QQ  709639943 01.快速上手Ionic3 多平台开发企业级问答社区 02.基于大数据技术之电视收视率企业项目实战(hadoop+Spark) 03.Node.js入门到企业Web开发中的应用 04.精通高级RxJava 2响应式编程思想 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.全面系统讲解CSS 工作应用+面试一步搞定 09.Java Spring Security开