我们在开发过程中,为了代码得可读性和易维护性,肯定是须要多个代码文件的,而不不过通过 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. RabbitMQ错误检查

    今天使用RabbitMQ做数据下发操作,当在发送端声明了Exchange后 打开RabbitMQ的管理控制台,可以查看,其中已经创建了Exchange 但并没有Queue 接着运行接收端,发现以下错误 ...

  2. OSI、TCP、IP、UDP 这些都是啥??

    一个大大的问号首先抛出,计算机之间是如何进行通信的? 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统. 网络协议就是数据按照一定的 ...

  3. 移动端meta标签

    现在的手机或平板电脑等移动设备上的浏览器默认都有双击放大的设置,如何阻止双击放大?user-scalable=no <!-- 禁止缩放 --> <meta name=”viewpor ...

  4. python lambda简单介绍

    python lambda 在python中,如果想要创建函数需要使用关键字def,而如果想要创建匿名函数,就需要使用lambda. lambda创建的函数和def创建的函数有什么区别? def创建的 ...

  5. 决策树算法(ID3)

    Day Outlook Temperature Humidity Wind PlayTennis 1 Sunny Hot High Weak No 2 Sunny Hot High Strong No ...

  6. Where should we fork this repository?

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 我们应该在哪里分叉这个存储库? Where should we fork this re ...

  7. SPOJ QTREE

    QTREE /* 题目大意:维护一棵树,允许修改边权以及查询链上最大值 题解:我们将边权转为点权,标记在深度较深的点上,树链剖分后用线段树处理即可 */ #include <cstdio> ...

  8. Codeforces Round #248 (Div. 1) A. Ryouko's Memory Note 水题

    A. Ryouko's Memory Note 题目连接: http://www.codeforces.com/contest/434/problem/A Description Ryouko is ...

  9. opencv+vs2012环境搭建教程

    1. 安装OpenCV和VS. 本人电脑安装的是opencv2.4.10和vs2012 2.配置环境变量 以下以win8 64位系统为例: 计算机->属性->高级系统设置->环境变量 ...

  10. C# 高级编程9 第30章MEF C#可扩展编程之MEF第2章(抄录)

    Managed Extensibility Framework (MEF) 什么是 MEF?   Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用 ...