parse_ini_file() 函数用于解析INI配置文件,并将其内容转换为数组。
INI文件是一种常见的配置文件格式,通常用于存储应用程序的设置。此函数支持标准的INI文件语法,包括节(sections)、键值对、注释等。
parse_ini_file ( string $filename , bool $process_sections = false , int $scanner_mode = INI_SCANNER_NORMAL ) : array|false
| 参数 | 类型 | 说明 |
|---|---|---|
filename |
字符串 | 要解析的INI文件的文件名 |
process_sections |
布尔值 | 设置为true时返回多维数组,包含节(section)名称。默认为false |
scanner_mode |
整数 | 可以是INI_SCANNER_NORMAL(默认),INI_SCANNER_RAW或INI_SCANNER_TYPED |
| 常量 | 说明 |
|---|---|
INI_SCANNER_NORMAL |
默认模式。值被解析为字符串,但保留常量替换 |
INI_SCANNER_RAW |
原始模式。值被原样返回,不解析常量 |
INI_SCANNER_TYPED |
类型模式。尝试将值转换为适当的PHP类型(布尔值、整数、浮点数、字符串) |
成功时返回一个包含配置设置的关联数组或多维数组,失败时返回 false。
; 这是一个示例INI配置文件
; 注释以分号开头
; 基本的键值对
site_name = "我的网站"
debug_mode = true
max_connections = 100
pi_value = 3.14159
; 节(section)
[database]
host = "localhost"
username = "root"
password = "secret"
port = 3306
charset = "utf8mb4"
[mail]
smtp_host = "smtp.example.com"
smtp_port = 587
smtp_secure = "tls"
from_email = "noreply@example.com"
; 数组表示
[permissions]
users[] = "admin"
users[] = "editor"
users[] = "viewer"
; 使用常量
[paths]
base_path = "/var/www/html"
log_path = "/var/log/app"
temp_path = "/tmp/app"
假设我们有上面的config.ini文件
<?php
// 解析INI文件(不处理节)
$config = parse_ini_file('config.ini');
if ($config !== false) {
echo "配置加载成功!\n";
echo "网站名称: " . $config['site_name'] . "\n";
echo "调试模式: " . ($config['debug_mode'] ? '开启' : '关闭') . "\n";
echo "最大连接数: " . $config['max_connections'] . "\n";
// 打印所有配置
echo "\n所有配置:\n";
print_r($config);
} else {
echo "无法解析INI文件\n";
}
?>
<?php
// 解析INI文件并处理节
$config = parse_ini_file('config.ini', true);
if ($config !== false) {
echo "配置加载成功!\n\n";
// 访问全局设置
echo "全局设置:\n";
echo "网站名称: " . $config['site_name'] . "\n";
echo "调试模式: " . ($config['debug_mode'] ? '开启' : '关闭') . "\n\n";
// 访问数据库设置
echo "数据库设置:\n";
echo "主机: " . $config['database']['host'] . "\n";
echo "用户名: " . $config['database']['username'] . "\n";
echo "端口: " . $config['database']['port'] . "\n\n";
// 访问邮件设置
echo "邮件设置:\n";
echo "SMTP主机: " . $config['mail']['smtp_host'] . "\n";
echo "SMTP端口: " . $config['mail']['smtp_port'] . "\n";
// 打印完整结构
echo "\n完整配置结构:\n";
print_r($config);
} else {
echo "无法解析INI文件\n";
}
?>
<?php
// 创建一个测试INI文件
$iniContent = <<<INI
bool_value = true
int_value = 123
float_value = 3.14
string_value = "hello"
null_value = null
INI;
file_put_contents('test.ini', $iniContent);
// 使用不同的扫描模式
echo "INI_SCANNER_NORMAL:\n";
$normal = parse_ini_file('test.ini', false, INI_SCANNER_NORMAL);
print_r($normal);
echo "\nINI_SCANNER_RAW:\n";
$raw = parse_ini_file('test.ini', false, INI_SCANNER_RAW);
print_r($raw);
echo "\nINI_SCANNER_TYPED:\n";
$typed = parse_ini_file('test.ini', false, INI_SCANNER_TYPED);
print_r($typed);
// 检查类型
echo "\n类型检查:\n";
foreach ($typed as $key => $value) {
echo "$key: " . $value . " (" . gettype($value) . ")\n";
}
// 清理
unlink('test.ini');
?>
<?php
class Config
{
private static $instance = null;
private $config = [];
private function __construct() {
// 私有构造函数防止直接实例化
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function load($filename) {
if (!file_exists($filename)) {
throw new Exception("配置文件不存在: $filename");
}
$this->config = parse_ini_file($filename, true, INI_SCANNER_TYPED);
if ($this->config === false) {
throw new Exception("无法解析配置文件: $filename");
}
}
public function get($key, $section = null) {
if ($section !== null) {
return $this->config[$section][$key] ?? null;
}
return $this->config[$key] ?? null;
}
public function getSection($section) {
return $this->config[$section] ?? [];
}
public function getAll() {
return $this->config;
}
}
// 使用配置类
try {
$config = Config::getInstance();
$config->load('config.ini');
echo "数据库主机: " . $config->get('host', 'database') . "\n";
echo "SMTP主机: " . $config->get('smtp_host', 'mail') . "\n";
echo "调试模式: " . ($config->get('debug_mode') ? '是' : '否') . "\n";
// 获取整个数据库配置节
$dbConfig = $config->getSection('database');
echo "\n数据库配置:\n";
print_r($dbConfig);
} catch (Exception $e) {
echo "配置错误: " . $e->getMessage() . "\n";
}
?>
key = value,等号周围可以有空格[section_name]key[] = valuepath = ROOT_PATH . "/config"| 特性 | parse_ini_file() | parse_ini_string() |
|---|---|---|
| 输入源 | 文件 | 字符串 |
| 第一个参数 | 文件名(字符串) | INI字符串(字符串) |
| 适用场景 | 从文件读取配置 | 从数据库、API等读取配置字符串 |
| 性能 | 需要文件I/O操作 | 不需要文件I/O操作 |