PHP7扩展开发之配置项

2024-09-08 14:08
文章标签 配置 开发 扩展 php7

本文主要是介绍PHP7扩展开发之配置项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

我们经常使用的一些扩展,有的会在php.ini文件中会有一些配置项。这些配置项控制扩展的行为。如 opcache扩展,经常使用的配置项如下:

[opcache]
; 模块地址
zend_extension=opcache.so
; 开关打开
opcache.enable=1
; 开启CLI
opcache.enable_cli=1
; 可用内存, 酌情而定, 单位为:Mb
opcache.memory_consumption=528
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=8
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=10000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
opcache.revalidate_freq=60
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
opcache.fast_shutdown=1

那么如何实现读取配置文件中的配置项,并应用到扩展中呢?这个是本节要讨论的话题。本文将定义几个配置项,并演示如何读取和修改配置项。配置项如下:

[say]
extension=say.so
say.number=101
say.string=abc
say.boolean=1

代码

基础代码

这个扩展,我们将在say扩展上增加相关代码。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

代码实现

使用ext_skel命令生成的代码默认已经有配置项相关的代码,只是出于被注释状态。配置项的实现分以下几步。
第一步:声明变量
这一步声明的变量用于存储从配置文件中读取的配置项值。

//定义一个全局变量类型,代码在php_say.h文件中
ZEND_BEGIN_MODULE_GLOBALS(say)zend_long  global_number;char *global_string;zend_bool global_boolean;
ZEND_END_MODULE_GLOBALS(say)//声明一个全局变量
ZEND_DECLARE_MODULE_GLOBALS(say)

第二步:设置配置项参数
这一步主要是指定一些处理配置项的参数。
所有的配置项参数都必须在PHP_INI_BEGIN()PHP_INI_END()之间。代码如下:

PHP_INI_BEGIN()STD_PHP_INI_ENTRY("say.number",      "100", PHP_INI_ALL, OnUpdateLong, global_value, zend_say_globals, say_globals)STD_PHP_INI_ENTRY("say.string", "ab", PHP_INI_ALL, OnUpdateString, global_string, zend_say_globals, say_globals)STD_PHP_INI_ENTRY("say.boolean", "0", PHP_INI_ALL, OnUpdateBool, global_string, zend_say_globals, say_globals)
PHP_INI_END()

第三步:加载配置项
这一步主要是把配置项从配置文件中读取出来,根据第二步设置的参数,赋值给第一步声明的变量。
宏方法REGISTER_INI_ENTRIES();是用于加载配置文件的。这个宏方法默认是被注释掉,在PHP_MINIT_FUNCTION方法中。只要把注释给去掉即可。

PHP_MINIT_FUNCTION(say)
{......REGISTER_INI_ENTRIES();
}

第四步:读取配置项
在PHP扩展中读取配置项值,需要使用一个宏方法SAY_G()。这个宏方法定义在php_say.h中。
现在,我们定义一个方法show_ini()来显示配置项内容。代码如下:

PHP_FUNCTION(show_ini)
{zval arr;array_init(&arr);add_assoc_long_ex(&arr, "say.number", 10, SAY_G(global_number));add_assoc_string_ex(&arr, "say.string", 10, SAY_G(global_string));add_assoc_bool_ex(&arr, "say.boolean", 11, SAY_G(global_boolean));RETURN_ZVAL(&arr, 0, 1);
}

调用show_ini()方法

<?php$ini = show_ini();var_dump($ini);
?>

输出结果如下:

$ php ./test.php
array(3) {["say.number"]=>int(101)["say.string"]=>string(3) "abc"["say.boolean"]=>bool(true)
}

第五步:销毁配置项
这一步主要是为了在PHP进程结束时,释放配置项占用的资源。
销毁配置项是通过宏方法UNREGISTER_INI_ENTRIES()来实现的。这个方法默认在PHP_MSHUTDOWN_FUNCTION方法中。默认是被注释掉的。只要把注释去掉就可以了。代码如下:

PHP_MSHUTDOWN_FUNCTION(say)
{UNREGISTER_INI_ENTRIES();......
}

ZEND_BEGIN_MODULE_GLOBALS() ZEND_END_MODULE_GLOBALS() 用于定义一个全局变量结构体类型。把宏方法展开后的代码如下:

typedef struct _zend_say_globals {zend_long  global_number; //数字char *global_string; //字符串zend_bool global_boolean; //布尔
} zend_say_globals;

ZEND_DECLARE_MODULE_GLOBALS()是使用上面定义的类型,声明一个全局变量。展开后如下:

zend_say_globals say_globals;

定义了一个全局变量say_globals。

STD_PHP_INI_ENTRY()用于设置每个配置项的参数。这个宏方法有这么几个参数:
第一个参数:配置项在配置文件ini中的名称
第二个参数:默认值。当ini文件中不存在这个配置项时,使用这个默认值
第三个参数:修改范围。就是设置都在那些场景下可以修改。详细的可以查 PHP_INI_ALL
第四个参数:当赋值给全局变量前,会调用的函数。PHP内核已经给出了常用的几个函数。如OnUpdateLong
第五个参数:全局变量的成员名。对应zend_say_globals结构体中的成员。表明读取的值会赋值给这个成员。
第六个参数:全局变量的类型。就是上面定义的结构体。
第七个参数:全局变量名称。

SAY_G()用于读取全局变量的值。如,SAY_G(global_number)展开后的代码如下:

say_globals.global_number

源码下载

tar.gz格式下载
zip格式下载

原文链接:PHP7扩展开发之配置项

这篇关于PHP7扩展开发之配置项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148321

相关文章

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads