[php-src]一个Php扩展的结构
内容均以php5.6.14为例.
要拥有一个PHP扩展的架子,使用源码中准备好的 /ext/ext_skel 工具,可以生成一个可运行的扩展骨架。
不加选项运行 ./ext_skel,可查看所有可用选项的帮助文字。
1) ./ext_skel --extname=myext(扩展名),自动生成扩展目录 myext,并出现一段步骤提示:
意思是使用自己的扩展要经过这8步,但 buildconf 是在 php-src 内执行生成 configure 文件。
make 也相当于编译整个php,我们实际上可以直接在扩展内进行安装操作,和其它扩展一样。
扩展目录内真正有用的文件就三个 config.m4 , php_myext.h , myext.c .
--no-help 选项很有用,加上后不再出现上面一长段文字和骨架代码中显而易见的注释,对于已有开发经验的人来说比较整洁一点.
2) vi config.m4 主要是打开下面两个选项,去掉前面的dnl,让扩展支持 --with-myext, --enable-myext 选项,一个用来引入扩展,一个用来开启扩展:
其余的m4语法,等有功夫再回过头去看,目前仅需两项。
3) 编译安装扩展
cd myext
phpize (即 /usr/local/php/bin/phpize)
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test (可忽略)
make install
4) 使用
安装完生成的 myext.so 扩展文件在这个目录,/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226
最后,把 myext.so 加入到 php.ini 中,extension = myext.so
使用 php -m 可以查看是否安装成功,浏览器中则用phpinfo查看。
5) 开发
扩展模块编译进php后,后面修改了扩展源文件后,只需要重新 make && sudo make install .
Q&A
本地安装多个版本PHP时,通过在 ~/.bash_profile 中加入php命令行别名,如:
`alias php5.6.14=/usr/local/php5.6.14/bin/php`
source ~/.bash_profile 使立即生效,即可在CLI下使用 php5.6.14 -f 1.php 查看运行结果。
PHP的生命周期:
(命令执行) 扩展模块初始化 -> (请求脚本) 扩展请求初始化 -> (执行脚本) 扩展请求关闭 -> (完成请求) 扩展模块关闭
这些都在你的扩展主文件 myext.c 中。
PHP_MINIT_FUNCTION(myext)
{
# 注册常量或类等初始化操作
return SUCCESS;
} PHP_RINIT_FUNCTION(myext)
{
# 例如记录请求开始时间
return SUCCESS;
} PHP_RSHUTDOWN_FUNCTION(myext)
{
# 例如记录请求结束时间,记录日志
return SUCCESS;
} PHP_MSHUTDOWN_FUNCTION(myext)
{
# 注销一些持久化资源
return SUCCESS;
}
开发文档:https://github.com/farwish/php-core-hack
Link: http://www.cnblogs.com/farwish/p/5208653.html
[php-src]一个Php扩展的结构的更多相关文章
- PHP扩展代码结构详解
PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展 内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/ ...
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...
- 我的第一个chrome扩展(1)——读样例,实现时钟
学习chrome扩展开发: 与网页类似,需要的知识:html,javascript chrome扩展程序的构成: manifest.json:对扩展程序的整体描述文件 { "manifest ...
- 一个可扩展的深度学习框架的Python实现(仿keras接口)
一个可扩展的深度学习框架的Python实现(仿keras接口) 动机 keras是一种非常优秀的深度学习框架,其具有较好的易用性,可扩展性.keras的接口设计非常优雅,使用起来非常方便.在这里,我将 ...
- 如何用原生js开发一个Chrome扩展程序
原文地址:How to Build a Simple Chrome Extension in Vanilla JavaScript 开发一个Chrome扩展程序非常简单,只需要使用原生的js就可以完成 ...
- Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
Maven 使用了一个标准的目录结构和一个默认的构建生命周期. 约定优于配置 当创建 Maven 工程时,Maven 会创建默认的工程结构.开发者只需要合理的放置文件,而在 pom.xml 中不再需要 ...
- 教你如何写一个 Yii2 扩展
前言 把一系列相关联的功能使用模块开发,好处多多,维护起来很方便,模块还可以单独发布出去,让下一个项目之间使用,真是方便. 下面我就写一个开发扩展的简单教程. Gii gii 自带帮助我们生成一个基本 ...
- 【视频】从零开始编写第一个PHP扩展
Rango会讲解在Linux下从零开始写一个PHP扩展,并编译安装到PHP里,一直到执行扩展中的函数.包含的内容有: 为什么要开发PHP扩展 ext_skel工具的使用 修改config.m4 php ...
- 给IConfiguration写一个GetAppSetting扩展方法
给 IConfiguration 写一个 GetAppSetting 扩展方法 Intro 在 .net core 中,微软已经默认使用 appsettings.json 来代替 app.config ...
随机推荐
- PostMessager来对子父窗体进行跨域
一.为什么需要使用postMessage这个跨域技术 对于一个普通的页面而言,如果页面中的数据量太多时,会导致某个页面的数据量太多 二显得特别的臃肿,所以通常是使用iframe的方式来加载子页面,但是 ...
- java反射学习笔记
1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...
- angularjs jquery thinkPHP3.2.3 相结合小实例
angular1.5 与 jquery想结合一个小应用 index.html <html> <head> <meta charset="utf-8"& ...
- eclipse将编辑栏一分为二
今天无意中发现一个MyEclipse的功能,CTRL SHIF - 三个键一起按下时,同一个编辑窗口会一分为二.这样我们写下面代码需要参考前面代码的时候就很方便了.
- day5_常用模块
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- java中string stringbuilder stringbuffer 的区别
1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...
- Entity Framwork(EF) 7——在Controller内获取指定字段的值
一.开发背景: 在用户登录的时候,验证用户和密码是否正确.验证通过后将用户名和用户ID保存下来以便后续数据更新时使用. 二.用户验证方法: 1.创建DBContext 对象. ApplicationD ...
- sql条件中比较性能优化
第一个比第二个性能高. 查询语句意义: 如果codelist中tablecode配置为0时, t.Table_Code = 'SV_RETURN_BILL'不生效. 如果codelist中tablec ...
- 43. studio上的json串解析
var doc = O_PARAMETER.FJSonStr;(doc为:{"items":[],"nextId":0}) //1.先转为json对象,主要有以 ...
- 小杨同学git使用记(适合使用过git但是不熟练的童鞋)
首先声明:这不是一篇git使用手册或者指南,如果要详细的git使用指南,下面是廖雪峰的git教程,可以系统学习廖雪峰的git教程,当然,如果你想马上以一种正确的方式使用git,那么接下来你很快就会学会 ...