Php7中如何获取ini配置?

本文和大家分享的主要是php7的扩展声明与ini配置获取相关内容,一起来看看吧,希望对大家学习php有所帮助。

今天在开发PHP扩展中遇到了获取ini配置的需求,采用如下的方法获取发现得到的是空值:

static inline String ini_get(String varname){

char *value = zend_ini_string((char *) varname.c_str(), (uint) varname.length(), 0);

if (!value)

{

return "";

}

return value;

}

在ini文件中我是这样配置的:

[catx]

catx.abc = "hello"

经过谷歌搜索,发现了 这篇博客 介绍了INI的使用方式,发现ini是需要先声明才能获取的。

通常的用法,是先通过下面的宏定义一个INI数组:

ZEND_INI_BEGIN()

ZEND_INI_ENTRY("catx.abc", "hi", PHP_INI_ALL, NULL)ZEND_INI_END()

通过查看Zend源码,其对应展开如下:

#define ZEND_INI_BEGIN()                static const zend_ini_entry_def ini_entries[] = {

#define ZEND_INI_ENTRY(name, default_value, modifiable, on_modify) \

ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify, NULL)

#define ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify, displayer) \

ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, NULL, NULL, NULL, displayer)

#define ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer) \

{ name, on_modify, arg1, arg2, arg3, default_value, displayer, modifiable, sizeof(name)-1, sizeof(default_value)-1 },

#define ZEND_INI_END()          { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0} };

其实就是定义了一个zend_ini_entry_def的数组,其名字固定叫做ini_entries,里面每一项是要注册的INI配置。

上面的宏定义,无论你是在函数里还是全局作用域定义都是可以的,但是还需要主动注册到zend里去,通常用下面的2个宏来搞定:

#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries, module_number)

#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries(module_number)

上述宏默认就会找ini_entries变量传进去,第二个参数module_number你可以在扩展的MINIT和MSHUTDOWN两个函数的回调参数里得到,所以REGISTER_INI_ENTRIES要在MINIT里调用,后者在MSHUTDOWN里调用用于销毁注册的INI配置。

再就是关注一下zend_ini_entry_def的定义:

typedef struct _zend_ini_entry_def {

const char *name;

ZEND_INI_MH((*on_modify));

void *mh_arg1;

void *mh_arg2;

void *mh_arg3;

const char *value;

void (*displayer)(zend_ini_entry *ini_entry, int type);

int modifiable;

uint name_length;

uint value_length;

} zend_ini_entry_def;

name是ini配置的key,value是默认值(也就是ini里没配置时候的值),mh_arg1-3是用户可以指定的上下文参数(主要是用来displayer和on_modify回调时候提供上下文),modifiable是限制是否可以通过ini_set来修改ini配置,name_length是name的长度,value_length是value的长度。

on_modify和displayer没必要用,通过php代码ini_set修改变量可以直接反应到zend_ini_string的结果中,这些回调函数只是给你一个主动通知机制,一般是用不到的。

因为 PHP-X项目 是C++封装的Zend api,所以没法直接用上面的宏来搞定这些事情,因此需要绕过宏直接与Zend api交互:

// INI

struct IniEntry {

std::string name;

std::string default_value;

int modifiable;

};

// modifiable can be one of these:PHP_INI_SYSTEM/PHP_INI_PERDIR/PHP_INI_USER/PHP_INI_ALL

void addIniEntry(const char* name, const char* default_value = "", int modifiable = PHP_INI_ALL)

{

IniEntry entry;

entry.name = name;

entry.default_value = default_value;

entry.modifiable = modifiable;

ini_entries.push_back(entry);

}

protected:

std::vectorini_entries;

通过上述接口,允许用户添加若干ini配置,当MINIT回调的时候一股脑给它注册上去:

void Extension::registerIniEntries(int module_number) {

if (!ini_entries.size()) {

return;

}

zend_ini_entry_def* entry_defs = new zend_ini_entry_def[ini_entries.size() + 1];

for (auto i = 0; i < ini_entries.size(); ++i) {

IniEntry& entry = ini_entries[i];

zend_ini_entry_def def = {

entry.name.c_str(), // name

NULL,   // on_modify

NULL,   // mh_arg1

NULL,   // mh_arg2

NULL,   // mh_arg3

entry.default_value.c_str(), // value

NULL,   // displayer

entry.modifiable, // modifiable

(uint)entry.name.size(), // name_length

(uint)entry.default_value.size(), // value_length

};

entry_defs[i] = def;

}

memset(entry_defs + ini_entries.size(), 0, sizeof(*entry_defs));

zend_register_ini_entries(entry_defs, module_number);

delete []entry_defs;

}

当MSHUTDOWN的时候一键卸载:

void Extension::unregisterIniEntries(int module_number) {

if (ini_entries.size()) {

zend_unregister_ini_entries(module_number);

}

}

这样就搞定ini了~

来源:鱼儿的博客

时间: 2024-10-07 00:39:31

Php7中如何获取ini配置?的相关文章

Eclipse中的eclipse.ini配置

今天在使用Eclipse的时候,需要使用64位的jdk和64位的版本的Eclipse,但是本地电脑上安装的都是32位的.开始的时候64位的Eclipse在没有64为jdk的时候会报错: Failed to load the JNI shared library "E:\java\bin\..\jre\bin\client\jvm.dll".Eclipse和jdk的位数是相对应的.所以必须使用64位的jdk. 在安装了64位jdk后,需要对Eclipse的eclipse.ini进行配置.

Java 中${key}获取应用配置信息

${key} 中key的值来至于系统配置信息                 Properties properties = System.getProperties(); @SuppressWarnings("unchecked") Enumeration<String> keys = (Enumeration<String>) properties.propertyNames(); while(keys.hasMoreElements()){ String 

深入理解php中的ini配置(2)

继续接着上一篇写. 1,运行时改变配置 在前一篇中曾经谈到,ini_set函数可以在php执行的过程中,动态修改php的部分配置.注意,仅仅是部分,并非所有的配置都可以动态修改.关于ini配置的可修改性,参见:http://php.net/manual/zh/configuration.changes.modes.php 我们直接进入ini_set的实现,函数虽然有点长,但是逻辑很清晰: PHP_FUNCTION(ini_set) { char *varname, *new_value; int

CI获取自定义配置文件中的二维配置数组

CI获取自定义配置文件中的二维配置数组:如:在admin.php配置文件中有如下配置:$config['admin_menu'][] = array( 'name' => '商品管理', 'c' => 'goods', 'a' => 'lists', 'icon'=>' icon-gift', 'item' => array( //商品 0 => array('name' => '商品列表', 'c' => 'goods', 'a' => 'lists

php扩展开发-INI配置

php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配置项#include "php_ini.h" //ini配置的创建和全局变量的类似,通过宏定义创建一个结构体,来保存INI的配置项//参数说明://1,配置名称//2,配置值//3,作用域//4,修改时的回调函数,可以为NULL PHP_INI_BEGIN() PHP_INI_ENTRY(

apache httpd.conf配置及php.ini配置建议

1)     php.ini配置 扩展配置 (注意观察extention_dir路径是否与物理路径一致) extension=php_gd2.dll 几乎是必开,这个图形处理扩展被广泛地应用在上传头像处理.在线照片处理.验证码等等地方. extension=php_mbstring.dll 几乎也是必开,没有他,多字节字符串(如中文)截取将会变得异常的复杂. extension=php_pdo_mysql.dll PHP5.3默认已经集成了PDO(如果低于5.3的话应该会有extension=p

第四章 INI配置——《跟我学Shiro》

之前章节我们已经接触过一些INI配置规则了,如果大家使用过如Spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根对象securityManager开始. 4.1 根对象SecurityManager 从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的:也就是所有操作都是自它开始的,这个对象是线程安全且真个应用只需要一个即可,因此Shiro提供了Securi

centos6.5中部署Zeppelin并配置账号密码验证

centos6.5中部署Zeppelin并配置账号密码验证1.安装JavaZeppelin支持的操作系统如下图所示.在安装Zeppelin之前,你需要在部署的服务器上安装Oracle JDK 1.7或以上版本, 并配置好相应的JAVA_HOME环境变量.以CentOS为例,具体操作过程如下: a)下载并安装jdk-8u111-linux-x64.rpm # rpm -ivh jdk-8u111-linux-x64.rpm b)配置环境变量.在/etc/profile文件结尾添加: export

Shiro学习笔记(4)——ini 配置

ini 配置文件 在前面三个笔记中也有使用到ini配置文件,但是没有进行详细的解析,本次来介绍一下如何配置. ini配置文件其实和properties配置文件一样的使用方法,都是键值对的形式(key=value),#号代表注释 ini配置中主要配置有四大类:main,users,roles,urls [main] #提供了对根对象 securityManager 及其依赖的配置 securityManager=org.apache.shiro.mgt.DefaultSecurityManager