我们在开发过程中,为了代码得可读性和易维护性,肯定是须要多个代码文件的,而不不过通过 ext_skel 生成得骨架文件。

这篇文章主要介绍下。多个代码文件的时候。我们须要注意什么,以及怎么做。

我的代码文件例如以下(slash为我的扩展名)

// ext_skel 生成默认得模块相关的主要文件
php_slash.h // 头文件
slash.c // 源代码文件
config.m4 // 编译的时候须要改动的文件

在这个默认生成的骨架文件中面,我们只要运行以下几步,就能够完毕一个新的扩展了。

删除config.m4的第10-12行开头的凝视dnl
phpize
./configure
make && make install

通过上面的步骤,我们就完毕了一个扩展,通过 dl(“slash.so”);的方式就能够进行測试了。假设编写一个类在上一篇文章里有介绍。

以下我们介绍添加新的类和源代码文件以及怎样编译配置等。

添加一个新的php类(Slash_Http_Util),而且给该类添加一个 getIv 的方法,php代码測试代码例如以下:

$httpUtil = new Slash_Http_Util();
$httpUtil->getIv(); // 会输出 HELLO

源代码文件 slash_http_util.h

#ifndef SLASH_HTTP_UTIL_H
#define SLASH_HTTP_UTIL_H extern zend_class_entry *slash_http_util_ce; PHP_METHOD(slash_http_util, getIv);
SLASH_MINIT_FUNCTION(http_util);
#endif

源代码文件 slash_http_util.c

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif #include "php.h"
#include "php_ini.h" /* for zend_alter_ini_entry */ #include "php_slash.h"
#include "slash_http_util.h" zend_class_entry *slash_http_util_ce; PHP_METHOD(slash_http_util, getIv) {
php_printf("HELLO");
RETURN_TRUE;
} zend_function_entry slash_http_util_methods[] = {
ZEND_ME(slash_http_util, getIv, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_FE_END
}; SLASH_MINIT_FUNCTION(http_util) {
zend_class_entry ce;
SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_HTTP_UTIL, slash_http_util_methods);
slash_http_util_ce = zend_register_internal_class(&ce TSRMLS_CC); return SUCCESS;
}

以上的代码完毕了新类的加入。而且给该类添加了一个叫 getIv 的方法。

以下须要改动我的 config.m4 配置文件,添加 slash_http_util.c 这个文件。

打开 config.m4 到最后倒数第二行。默认 ext_skel 生成的代码是

PHP_NEW_EXTENSION(slash,slash.c,$ext_shared)

改动,添加 slash_http_util.c 这个文件,须要注意的是两个 *.c 文件之间是空格,没有标点符号

PHP_NEW_EXTENSION(slash,slash.c slash_http_util.c, $ext_shared)

完毕 config.m4 的改动以后,还须要去改动 slash.c 这个文件,默认情况下在这个文件中会有以下的代码

PHP_MINIT_FUNCTION(slash)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
return SUCCESS;
}

我们须要把我们新创建的这个类载入进来

PHP_MINIT_FUNCTION(slash)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
SLASH_STARTUP(http_util);
return SUCCESS;
}

通过这几步,新的类就全然创建成功了,你能够通过 phpize、configure、make 来编译这个模块了。最后通过我们開始制定的目标进行測试。

几个须要注意的问题:

1. 改动 config.m4 文件,添加源代码文件

2. 改动 config.m4 文件以后。须要又一次运行 phpize && ./configure && make

3. 在模块(slash.c文件)载入函数中 PHP_MINIT_FUNCTION 加入这个新的类。

上面的代码中假设你全然copy可能没办法通过编译,由于我自己定义重命名了几个宏(php_slash.h)。实际开发中你能够zend的宏。

#define SLASH_CN_HTTP_UTIL "Slash_Http_Util"

// {{{ php life cycle redefine
#define SLASH_MINIT_FUNCTION(module) PHP_MINIT_FUNCTION(slash_##module)
#define SLASH_MSHUTDOWN_FUNCTION(module) PHP_MSHUTDOWN_FUNCTION(slash_##module)
#define SLASH_RINIT_FUNCTION(module) PHP_RINIT_FUNCTION(slash_##module)
#define SLASH_RSHUTDOWN_FUNCTION(module) PHP_RSHUTDOWN_FUNCTION(slash_##module)
#define SLASH_STARTUP(module) PHP_MODULE_STARTUP_N(slash_##module)(INIT_FUNC_ARGS_PASSTHRU)
// }}} // {{{ class init mac
#define SLASH_INIT_CLASS_ENTRY(ce, name, methods) INIT_CLASS_ENTRY(ce, name, methods)
// }}}

以上代码仅供參考,欢迎交流。

php扩展开发笔记(2)多个源代码文件的配置和编译的更多相关文章

  1. firefox 扩展开发笔记(三):高级ui交互编程

    firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...

  2. zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下.   版本编译引导 zlib在windows上的mingw32 ...

  3. 常见浏览器扩展开发笔记(chrome firefox 360 baidu qq sougou liebao uc opera)

    浏览器扩展开发貌似时下很冷门啊,但是不少企业还是有类似的应用,360的抢票插件啊,笔者最近在做的网页翻译扩展之类的.笔者在开发的过程中,遇到了不少坑,说是坑,说白了就是各个厂商支持的API不统一导致的 ...

  4. Java开发笔记(九十四)文件通道的性能优势

    前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...

  5. Java开发笔记(九十二)文件通道的基本用法

    前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系 ...

  6. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  7. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数. 文接上篇 <超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSP ...

  8. Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用

    前话   项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现.   MQTT协议 简介   M ...

  9. 项目开发笔记-传单下发 名片替换 文件复制上传/html静态内容替换/json解析/html解析

    //////////////////////////// 注意: 此博客是个人工作笔记 非独立demo////////////////////////////////// .............. ...

随机推荐

  1. Bootstrap入门九:辅助类

    1.情境文本颜色 通过颜色来展示意图,Bootstrap 提供了一组工具类.这些类可以应用于链接,并且在鼠标经过时颜色可以还可以加深,就像默认的链接一样. <p class="text ...

  2. Qt Creator在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  3. FPGA In/Out Delay Timing Constaint

    先简单说说这段时间遇到的问题.FPGA采集前端scaler的视频数据.像素时钟(随路时钟),视频数据,行场同步,DE.这些信号进入FPGA后.通过CSC(颜色空间转换).输出后的图像有噪点.通过查看时 ...

  4. JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册   显示错误信息到页面上的另一种方法: public ...

  5. IBM斥资340亿美元收购红帽

    IBM宣布收购Linux巨头Red Hat,以每股190美元的现金收购其所有已发行股份,总价值约为340亿美元.这一交易是IBM历史上金额最高的一笔收购交易,也成为其在营收持续下滑的压力下,布局云计算 ...

  6. poj2676(数独)

    也是一个简单剪枝的dfs.记录所有为0的位置,依次填写,当发现某个空格可选的填写数字已经没有时,说明该支路无效,剪掉. 不算是一个难题吧,但是还是花了不少时间,问题主要出在细节上,行列坐标反了.3乘3 ...

  7. iOS 11开发教程(九)iOS11数据线连接真机测试

    iOS 11开发教程(九)iOS11数据线连接真机测试 在Xcode 7.0之后,苹果公司在开发许可权限上做了很多的改变,在测试App方面取消了一些限制.在Xcode7.0之前的版本,苹果公司只向注册 ...

  8. DataTable,List,Dictonary互转,筛选及相关写法

    1.创建自定义DataTable  /// 创建自定义DataTable(一) 根据列名字符串数组, /// </summary> /// <param name="sLi ...

  9. Android ContentObserver详解

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Content ...

  10. java多线程技术之八(锁机制)

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...