内容均以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扩展的结构的更多相关文章

  1. PHP扩展代码结构详解

    PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/ ...

  2. Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

    本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...

  3. 我的第一个chrome扩展(1)——读样例,实现时钟

    学习chrome扩展开发: 与网页类似,需要的知识:html,javascript chrome扩展程序的构成: manifest.json:对扩展程序的整体描述文件 { "manifest ...

  4. 一个可扩展的深度学习框架的Python实现(仿keras接口)

    一个可扩展的深度学习框架的Python实现(仿keras接口) 动机 keras是一种非常优秀的深度学习框架,其具有较好的易用性,可扩展性.keras的接口设计非常优雅,使用起来非常方便.在这里,我将 ...

  5. 如何用原生js开发一个Chrome扩展程序

    原文地址:How to Build a Simple Chrome Extension in Vanilla JavaScript 开发一个Chrome扩展程序非常简单,只需要使用原生的js就可以完成 ...

  6. Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

    Maven 使用了一个标准的目录结构和一个默认的构建生命周期. 约定优于配置 当创建 Maven 工程时,Maven 会创建默认的工程结构.开发者只需要合理的放置文件,而在 pom.xml 中不再需要 ...

  7. 教你如何写一个 Yii2 扩展

    前言 把一系列相关联的功能使用模块开发,好处多多,维护起来很方便,模块还可以单独发布出去,让下一个项目之间使用,真是方便. 下面我就写一个开发扩展的简单教程. Gii gii 自带帮助我们生成一个基本 ...

  8. 【视频】从零开始编写第一个PHP扩展

    Rango会讲解在Linux下从零开始写一个PHP扩展,并编译安装到PHP里,一直到执行扩展中的函数.包含的内容有: 为什么要开发PHP扩展 ext_skel工具的使用 修改config.m4 php ...

  9. 给IConfiguration写一个GetAppSetting扩展方法

    给 IConfiguration 写一个 GetAppSetting 扩展方法 Intro 在 .net core 中,微软已经默认使用 appsettings.json 来代替 app.config ...

随机推荐

  1. ubuntu16.04解决播放swf视频文件问题

    使用下面 sudo apt-get install swfdec-gnome

  2. Java中的枚举

    枚举通过enum关键字进行定义.实际上当定义一个枚举类型的时候,该类型默认继承了Enum类. 枚举的定义格式如下: enum Color { RED,BLUE,GREEN; } 下面演示一个枚举变量的 ...

  3. python_day3

    一.set的基本操作 >>> s1=set("abc123abc") >>> s1 #把字符串转化为set,去重 set([']) >&g ...

  4. centos 用dvd创建yum 仓库

    环境:CentOS 6.0 默认的yum是以网络来安装的,在没有网络或者网速不佳的情况下,通过yum来安装软件是意见非常痛苦的事情.其实对于CentOS DVD来说,里面提供的软件就足以满足我们的需要 ...

  5. vs2010中将c++控制台程序修改成windows应用程序

    报错:无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 vs2010环境下将Win32控制台应用程序,改为Win32项目 直接将控制台的mian函数改成 _ ...

  6. Flex加载google地图、百度地图以及天地图作底图

    一  Flex加载Google地图作底图 (1)帮助类GoogleLayer.as /* * 根据输入的地图类型加载Google地图(by chenyuming) */ package Layers ...

  7. 【转载】Java常量池

    本篇随笔为转载,原贴地址:Java常量池理解与总结. (其实Java的常量池有点像C++中的存储字符串常量的常量存储区). 一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法 ...

  8. markdown 的基本操作

    文档 http://mux.alimama.com/posts/620?spm=0.0.0.0.4VVnvp http://www.jianshu.com/p/1e402922ee32/ MdChar ...

  9. require和include的区别

    require 的使用方法如 require("MyRequireFile.php"); .这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require ...

  10. WPF 制作聊天窗口获取历史聊天记录

    腾讯从QQ2013版起开始在聊天记录里添加了历史记录查看功能,个人聊天窗口可以点击最上边的‘查看历史消息’,而群组里的未读消息可以通过滚动鼠标中键或者拖动滚动条加载更多消息,那这个用wpf怎么实现呢? ...