PHP7扩展开发入门_weixin_33910460的博客-程序员秘密

技术标签: 测试  php  json  

下载PHP源代码

要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。
我下载了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7....
解压源码压缩包, tar xzf php-7.0.2.tar.gz,我们现在只需要关注Zendext这两个目录。
Zend目录里面包含了PHPZend Engine源代码,有些函数和宏的定义我们需要在这里面简单地看一下。
ext目录里面包含了PHP原生的扩展,以及我们开发自己的扩展时可以利用的工具,Linux下使用ext_skelWindows下使用ext_skel_win32.php

使用ext_skel工具

我们可以在ext目录下看到所有的PHP原生扩展,其中包括了熟悉的curljson,mbstring,simplexmlsockets等扩展,还有很多没有用过甚至没有听说过的扩展,不用在意这些,我们先打开我们最熟悉的curl来看看,有config.m4配置文件,有php_curl.hcurl_file.c等源代码,还有一些中间文件,最后还有一个tests目录,里面放的curl扩展的单元测试。重点关注config.m4php_curl.hcurl_file.c即可,最简单的场景下这三个文件就是一个扩展的全部组成部分了。

打开随便看一下,不算太复杂,但是自己写一个类似的还是挺头疼的,这时就需要用到我前面提到的ext_skel工具了。这个工具也在ext目录下,我们执行一下,./ext_skel --help,可以看到若干参数,我们用到的只有--extname=module,这里填上自己开发的扩展名称。想深入了解各个参数的作用可以看这里:http://php.net/manual/en/inte...

./ext_skel --extname=hello

ext目录下多了一个hello目录,我们后续的工作都在这个目录下面,工具已经为我们自动生成了一些文件。

config.m4配置文件
开发PHP扩展,在写C代码之前,要先配置一下这里。我们打开可以看到详细的注释说明,dnl是注释语法。
如果你的扩展用到了外部依赖,就配置--with-hello选项,否则配置--enable-hello选项,删除这下面3行的dnl注释

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support])

PHP_ARG_WITHPHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要外部依赖的
配置好的内容,在后面执行configure --help时可以看到。

php_hello.h头文件
类似于C语音的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动

hello.c代码文件
真正的逻辑代码都在这个文件中,后面会详细介绍。

编写代码

好了,到这一步我们终于要开始写代码了,打开hello.c文件。
整个扩展的入口是zend_module_entry这个结构,具体的定义可以在Zend目录下的zend_modules.h文件中看到,一共有十几个属性,快速跳过,我们暂时只需要"hello world"。

zend_module_entry hello_module_entry = {
    STANDARD_MODULE_HEADER,
    "hello",
    hello_functions,
    PHP_MINIT(hello),
    PHP_MSHUTDOWN(hello),
    PHP_RINIT(hello),       /* Replace with NULL if there's nothing to do at request start */
    PHP_RSHUTDOWN(hello),   /* Replace with NULL if there's nothing to do at request end */
    PHP_MINFO(hello),
    PHP_HELLO_VERSION,
    STANDARD_MODULE_PROPERTIES
};
  • STANDARD_MODULE_HEADER帮我们实现了前面6个属性

  • "hello"是扩展的名字

  • hello_functions是扩展包含的全部方法的集合

  • 后面5个宏分别代表5个扩展特定方法

  • PHP_HELLO_VERSION是扩展的版本号,定义在头文件中

  • STANDARD_MODULE_PROPERTIES帮我们实现了剩下的属性

暂时都不需要修改,知道这是一个入口就行。顺着这个入口,我们继续看怎么给扩展添加方法,在hello_functions[]方法数组中已经有了一个示例方法confirm_hello_compiled,我们参考它写我们的方法hello_world

const zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE(hello_world,  NULL)
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};

先在扩展的方法数组中添加上hello_world,然后再定义hello_world。找到confirm_hello_compiled方法定义的地方,在它下面依葫芦画瓢,php_printfZend Engine中的printf方法。

PHP_FUNCTION(hello_world)
{
    php_printf("Hello World!\n");
    RETURN_TRUE;
}

编译安装

最后就是编译安装我们的扩展了,安装过PHP扩展的同学不用看,没有经验的可以参考一下。

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

现在PHP的扩展目录中已经有了hello.so这个文件,在php.ini中添加上扩展的配置

extension = hello.so

测试

写一个test.php方法,执行脚本就可以看到"Hello World!"

<?php
hello_world();
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33910460/article/details/89201678

智能推荐

apache+tomcat+mod_jk 集群安装说明_wolma的博客-程序员秘密

RedHat linux+apache+tomcat+mod_jk 集群安装说明1. 操作系统Red Hat Linux Enterprise 52. 所需软件Apache 2.2.X;Tomcat5.5.9; Mod_jk 1.2.23 for apache 2.2.X; Jdk 1_5_0_04  备注:下载时将所需软件包文件保存在/usr/local目录下3. 安装步

Hibernate-Criteria 模糊查询_weixin_30568591的博客-程序员秘密

Hibernate-Criteria 模糊查询 Hibernate-Criteria 模糊查询Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象。简单来 讲,Criteria Query可以看作是传统SQL的对象化表示,如: Criteria criteria = session.createCr...

计算机系统课程 笔记总结 CSAPP第五章 优化程序性能(5.1-5.14)_頔潇的博客-程序员秘密

GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.1-2.2) 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4) 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.2-3.4) 计算机系统课程 笔记总结 CSAPP第三章 程序的机器级表示(3.5-3.7) 计算机系统课程 笔记总结 ...

那些年我在CSDN追过的安全白帽师傅,respect_安全博客_Eastmount的博客-程序员秘密

2019年7月,我来到了一个陌生的专业——网络空间安全专业。作为一个长期以Python数据挖掘和NLP方向为主的学生,突然换大方向,去从事系统安全和逆向分析的研究,还是挺难的,这两年的过程也极其艰辛。依稀记得,换专业当天我下定决心:希望利用未来四年时间,深入学习安全技术,学会撰写高质量论文,并通过分享让更多的初学者了解和入门安全领域。更期盼博士早日毕业,回到家乡贵州继续从事安全技术和大数据分析的教学。

AXmath下载与安装_lilibiu的博客-程序员秘密

https://macno1.lanzoui.com/icj811g点击 普通下载可以看到文件很小。然后就是解压,安装等,常规流程。此时是分享版,部分功能还未解锁重点来了!!!打开文件夹crack把里面的exe文件复制之后拿到外面,粘贴,替换,然后重启即可这样就是免费的完整版本啦。ps:AXmath对于word的兼容性更好,比wps兼容好。虽然wps可以通过安装修补插件VBA来完成,但是终归是不稳定的,还是用word吧。有帮助记得 点赞收藏 呀~感谢...

循环神经网络matlab程序设计,matlab程序设计<神经网络源码>_kamalsheel的博客-程序员秘密

P=[ 108.60 111.84 693.14 1119.66 533.3880.01 184.58 160.32 253.28 89.18 158.68 213.48 28.59 441.63 590.93680.20 145.23 231.85 162.30 53.95 319.84 264.57 132.84 444.28272.17 217.27 349.27 222.99 47.79 ...

随便推点

第三周项目1-顺序表的基本运算_wman1997的博客-程序员秘密

/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:111.cpp *作 者:王曼 *完成日期:2016年9月19日 *版 本 号:v1.0 * *问题描述:实现顺序表基本运算有算法,依据“最小化”的原则进行测试。所谓最小化 原则

知物由学 | Lua脚本保护的前世今生_易盾 xxtea_网易易盾的博客-程序员秘密

不少安全专家表示,在互联网上失去对代码的控制,就像把银行的设计图交给抢劫犯一样。Lua是一种被广泛用于游戏开发中的一种计算机语言,方便开发者定制自己所需的功能。其中,红遍全球的《愤怒的小鸟》就是由Lua语言用Wax开发的。此外,梦幻西游、奇迹暖暖、开心消消乐、放置奇兵、最强蜗牛等手游也采用了Lua语言进行编写。近年来,Lua脚本在游戏行业长期流行,但Lua脚本泄露事件屡见不鲜,其安全性也引起关注。不法分子通过开私服、开外挂等途径,实现对游戏代码的商业变现,这给游戏开发者造成巨大...

实现Lucas-Kanade光流计算的Delphi类_thirdapple的博客-程序员秘密

{作者:刘留参考文献为:Jean-Yves Bouguet "Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm"http://www.aivisoft.net/Geo.Cra[at]gmail[dot]com}unit OpticalFlowLK;interfaceus

arduino结合74hc192实现计数显示_74hc192引脚及其功能_河西石头的博客-程序员秘密

这里我们利用74hc192计数器芯片,实现了百位数的显示,多位数显示必须存在进位运算,刚好192的TCU端口就为进位脉冲,当满10后就会出现一个高电平脉冲。用这种方法可以实现更多位数的显示。管脚说明:Do-D:并行数据输入端Qo-Q:数据输出端CU:加法计数脉冲输入端CD:减法计数脉冲输入或Rp:异步置0端(高电平有效)D:置数控制端(低电平有效)c:加法计数时,进位输出端(低电...

区块链中的共识算法_区块链技术头条的博客-程序员秘密

区块链中的共识算法在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性。 并且我们知道,截止目前使用最广泛,也是最被大家接受的共识算法,是我们先前介绍过的POW(proof of work)工作量证明算法。目前市值排名前二的比特币和以太坊也是采用的此算法。虽然POW共识算法取得了巨大的成功,但对它的质疑也从来...

判别分析及R实现_coefficients of linear discriminants中两个ld_海人001的博客-程序员秘密

目录简介两总体距离判别R实现 马氏距离判别 线性判别分析 多总体距离判别Bayes判别准则什么是先验概率先验概率取相等先验概率取不相等判别分析小结简介根据已知分类数据,分别计算各类重心,即是各组的均值,距离判别准则是,对任给的一次观测,若他与第i类的重心最近,就认为他来自第i类两总体距离判别设有两个总体 G1和G2,从第一个总体中抽取n1...

推荐文章

热门文章

相关标签