从零开始创建一个php扩展(代码片段)

author author     2022-11-23     533

关键词:

创建一个扩展的基本步骤都有哪些。示例中,我们将实现如下功能:

<?php
echo say();
?>

输出内容:

$ php ./test.php
$ hello word

在扩展中实现一个say方法,调用say方法后,输出 hello word。

第一步:生成代码

PHP为我们提供了生成基本代码的工具 ext_skel。这个工具在PHP源代码的./ext目录下。

$ cd php_src/ext/
$ ./ext_skel --extname=say

extname参数的值就是扩展名称。执行ext_skel命令后,这样在当前目录下会生成一个与扩展名一样的目录。

第二步,修改config.m4配置文件

config.m4的作用就是配合phpize工具生成configure文件。configure文件是用于环境检测的。检测扩展编译运行所需的环境是否满足。现在我们开始修改config.m4文件。

$ cd ./say
$ vim ./config.m4

打开,config.m4文件后,你会发现这样一段文字。

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(say, for say support,
dnl Make sure that the comment is aligned:
dnl [ --with-say Include say support])

dnl Otherwise use enable:

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

其中,dnl 是注释符号。上面的代码说,如果你所编写的扩展如果依赖其它的扩展或者lib库,需要去掉PHP_ARG_WITH相关代码的注释。否则,去掉 PHP_ARG_ENABLE 相关代码段的注释。我们编写的扩展不需要依赖其他的扩展和lib库。因此,我们去掉PHP_ARG_ENABLE前面的注释。去掉注释后的代码如下:

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(say, for say support,
dnl Make sure that the comment is aligned:
dnl [ --with-say Include say support])

dnl Otherwise use enable:

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

第三步,代码实现

修改say.c文件。实现say方法。
找到PHP_FUNCTION(confirm_say_compiled),在其上面增加如下代码:

PHP_FUNCTION(say)


    zend_string *strg;
    strg = strpprintf(0, "hello word");
    RETURN_STR(strg);

找到 PHP_FE(confirm_say_compiled, 在上面增加如下代码:

PHP_FE(say, NULL)

修改后的代码如下:

const zend_function_entry say_functions[] =


 PHP_FE(say, NULL)       /* For testing, remove later. */
 PHP_FE(confirm_say_compiled,    NULL)       /* For testing, remove later. */
 PHP_FE_END  /* Must be the last line in say_functions[] */

;
/ /

第四步,编译安装

编译扩展的步骤如下:

$ phpize
$ ./configure
$ make && make install

修改php.ini文件,增加如下代码:

[say]
extension = say.so

然后执行,php -m 命令。在输出的内容中,你会看到say字样。

第五步,调用测试

自己写一个脚本,调用say方法。看输出的内容是否符合预期。

BY KOCOR

原文地址:https://segmentfault.com/a/1190000016156051

从零开始写os内核(代码片段)

系列目录序篇准备工作BIOS启动到实模式GDT与保护模式虚拟内存初探加载并进入kernel显示与打印全局描述符表GDT中断处理虚拟内存完善实现堆和malloc创建第一个内核线程多线程运行与切换锁与多线程同步进程的实现进入用户态一... 查看详情

用python从零开始创建区块链(代码片段)

来源  https://learnblockchain.cn/2017/10/27/build_blockchain_by_python/ 本文主要内容翻译自LearnBlockchainsbyBuildingOne 本文原始链接,转载请注明出处。作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创... 查看详情

elasticsearch:从零开始构建一个定制的分词器(代码片段)

Elasticsearch提供了大量的analyzer和tokenizer来满足开箱即用的一般需求。有时,我们需要通过添加新的分析器来扩展Elasticsearch的功能。尽管Elastic提供了丰富的分词器,但是在很多的时候,我们希望为自己的语言或一种特... 查看详情

从零开始,使用dockerswarm部署集群教程(代码片段)

 本文首先从Dockerfile创建了一个简单web镜像然后将web镜像推送到了远程仓库,以备后面集群中不同机器自动下载之后使用docker-compose.yml配置了一个应用而后新建了2台虚拟机作为swarm节点,并部署应用的5个实例在这两台虚拟机... 查看详情

从零开始搭建一个react项目(代码片段)

 如果只是想试试React,那么建议使用create-react-app来创建一个react项目。快速开始因为create-react-app和vue-cli不一样,create-react-app将webpack的相关配置直接封装好了,所以自定制化程度不高,所以考虑手动构建一个React项目代码下... 查看详情

从零开始搭建一个动态网站(代码片段)

从零开始搭建一个动态网站事情的起因是我帮一个朋友忙emmm当时觉得自己多多少少大大小小做了不少项目,借想都没想就接下来了对了,做前端的时候用到了bootstrap,bootstrap牛逼!太嘤嘤嘤了。但是后来才发现工作量实在比较... 查看详情

从零开始搭建一个动态网站(代码片段)

从零开始搭建一个动态网站事情的起因是我帮一个朋友忙emmm当时觉得自己多多少少大大小小做了不少项目,借想都没想就接下来了对了,做前端的时候用到了bootstrap,bootstrap牛逼!太嘤嘤嘤了。但是后来才发现工作量实在比较... 查看详情

observability:从零开始创建java微服务并监控它(代码片段)

这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,... 查看详情

从零开始学习java设计模式|创建型模式篇:原型模式(代码片段)

在本讲,我们来学习一下创建型模式里面的第四个设计模式,即原型模式。概述原型模式就是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。这段话读起来有点绕,... 查看详情

webpack4.x从零开始初始化一个vue项目(代码片段)

创建目录项目名称:vue-initappcssreset.sassjshomeindex.vuerouterindex.jsmain.jsApp.vueviewsindex.html安装webpacknpmi-Dwebpack创建配置文件webpack.config.js基础配置entry入口module模块plugins插件output输出进阶配置resolvedevtooldevServer. 查看详情

lfs系列从零开始diylinux系统:构建lfs系统-创建目录(代码片段)

现在准备创建LFS文件系统里的一些目录结构。使用下面的命令创建一个标准的目录树:mkdir-pv/bin,boot,etc/opt,sysconfig,home,lib/firmware,mnt,optmkdir-pv/media/floppy,cdrom,sbin,srv,varinstall-dv-m0750/rootinstall-dv-m1777/tmp/va 查看详情

php之gd库扩展(代码片段)

一、开始GD扩展GD库是用来处理图片的。使用GD库,首先在php.ini中开启GD扩展extension=php_gd2.dll开启以后就可以使用image开头的函数了二、创建最简单的图片步骤创建画布给画布填充颜色(给画布分配的第一个颜色自动填... 查看详情

从零开始一个http服务器-开始(一)(代码片段)

从零开始一个http服务器(一)代码地址:https://github.com/flamedancer/cservergitcheckoutstep1一个简单的socketserver从helloworld开始回顾c语言的socket通信一个简单的socketserver用telent测试从helloworld开始先来回顾下c语言的,c语言的helloword程序如... 查看详情

从零开始的安卓开发环境搭建与入门(代码片段)

1、官网下载androidstudio2、阅读、勾选同意协议并点击下载3、下载完成后打开4、安装完成,打开后5、创建项目6、创建一个空Activity的项目7、输入项目名和选择语言以及SDK版本8、点击build等待下载完成9、下载时间4分钟到40分... 查看详情

django-rest-framework-从零开始-1-创建项目(代码片段)

django-rest-framework-从零开始-1-创建项目1、下载模块python-mpipinstalldjangopython-mpipinstalldjangorestframework本次学习基于python3.9,python安装的绝对路径为F:\\Python3.9.12,安装完django后,默认在python的安装路径下的Scripts文件夹(即F:\\Python3.9.12\\... 查看详情

从零开始用swift开发一个ios应用(仿微博)开篇-1.demo上手体验(代码片段)

最近在学iOS开发,本系列会针对iOS从前到后的开发进行全面讲解,小到开发工具使用,大到应用市场上线。需求:1.显示一个橘黄色矩形2.矩形上面一个按钮可以点击,并有响应事件3.界面中心显示一张图片系统版本:MacOS版本:1... 查看详情

从零开始编写一个vue插件(代码片段)

title:从零开始编写一个vue插件toc:truedate:2018-12-1710:54:29categories:Webtags:vuemathjax写毕设的时候需要一个mathjax编辑器,因此直接写一个插件试一下。准备账号进入npm注册账号初始化项目vueinitwebpack-simplemathjax-toolbarcdmathjax-toolbarnpminstall... 查看详情

从零开始学习java设计模式|创建型模式篇:单例设计模式(代码片段)

从本讲开始,咱们就要开始正式学习23种设计模式了。当然,我们得按照顺序来学,首先先来学习23种设计模式里面的第一类模式,即创建型模式。创建型模式的主要关注点是"怎样创建对象?",它的... 查看详情