php扩展开发笔记(2)多个源代码文件的配置和编译
我们在开发过程中,为了代码得可读性和易维护性,肯定是须要多个代码文件的,而不不过通过 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)多个源代码文件的配置和编译的更多相关文章
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
- 常见浏览器扩展开发笔记(chrome firefox 360 baidu qq sougou liebao uc opera)
浏览器扩展开发貌似时下很冷门啊,但是不少企业还是有类似的应用,360的抢票插件啊,笔者最近在做的网页翻译扩展之类的.笔者在开发的过程中,遇到了不少坑,说是坑,说白了就是各个厂商支持的API不统一导致的 ...
- Java开发笔记(九十四)文件通道的性能优势
前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...
- Java开发笔记(九十二)文件通道的基本用法
前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数. 文接上篇 <超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSP ...
- Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用
前话 项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现. MQTT协议 简介 M ...
- 项目开发笔记-传单下发 名片替换 文件复制上传/html静态内容替换/json解析/html解析
//////////////////////////// 注意: 此博客是个人工作笔记 非独立demo////////////////////////////////// .............. ...
随机推荐
- MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值
F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...
- Mac下安装Docker
1.去"https://docs.docker.com/docker-for-mac/"下载安装包  2.根据提示安装下载好的Docker.dmg 3.运行Docker 4.在终 ...
- 02:实现Singleton模式
Java实现单例模式有很多种实现方法,其中我们应根据需要选择线程安全的与非线程安全的两种方式,根据对象实现的方式又分为饱汉与饿汉方式. 这里使用java中的volatile关键字与synchroniz ...
- js缓存加密
1.访问A链接就以A链接的特定部分为密码盐,生成一个js跳转配置文件名 aojoweiojoiwjeiof2.PHP在生成js跳转文件名的时候,也是根据数据库中的跳转起始链接特定部分作为盐,生成的文件 ...
- 人工智能我见及特征提取mfcc算法理解
一.人工智能 从LeNex手写数字识别,AlexNet图像识别,到无人驾驶汽车,再到Alpha Go.Alpha Go Zero的横空出世,人工智能无疑已经成为了当下科技的大热.那么什么是人工智能呢? ...
- Stringbuilder & Stringbuffer
StringBuilder和StringBuffer的父类都是继承了 AbstractStringBuilder, 他们各自的append方法都是调用了 super.append(str), 但是一个 ...
- 如何正确使用 Django的User Model
阅读目录(Content) django——重写用户模型 1.修改配置文件,覆盖默认的User模型 2.引用User模型 3.指定自定义的用户模型 4.扩展Django默认的User 5.自定义用户与 ...
- android setContentView
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha setContentView 这个 就是 设置内容视图. 装饰视图 DecorView ...
- luoguP3952 [NOIP2017]时间复杂度 模拟
原本只是想看下多久能码完时间复杂度 然后在30min内就码完了,然后一A了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
- bzoj 2460 拟阵+判线性相关
/************************************************************** Problem: 2460 User: idy002 Language: ...