PHP parse_ini_file() 函数

提示:parse_ini_file() 函数用于解析INI配置文件,并将其内容转换为关联数组或多维数组。这是读取配置文件的标准方法,可以轻松地管理应用程序的配置。

定义和用法

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

scanner_mode 常量

常量 说明
INI_SCANNER_NORMAL 默认模式。值被解析为字符串,但保留常量替换
INI_SCANNER_RAW 原始模式。值被原样返回,不解析常量
INI_SCANNER_TYPED 类型模式。尝试将值转换为适当的PHP类型(布尔值、整数、浮点数、字符串)

返回值

成功时返回一个包含配置设置的关联数组或多维数组,失败时返回 false

INI文件语法

示例INI文件 (config.ini):
; 这是一个示例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"

示例

示例 1:基本用法 - 读取INI文件

假设我们有上面的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";
}
?>

示例 2:处理节(sections)

<?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";
}
?>

示例 3:使用不同的扫描模式

<?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');
?>

示例 4:高级用法 - 配置类

<?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";
}
?>

INI文件语法规则

  1. 注释:以分号(;)或井号(#)开头
  2. 键值对:格式为 key = value,等号周围可以有空格
  3. 值类型:可以是字符串、整数、浮点数、布尔值(true/false, on/off, yes/no)
  4. 字符串:可以用双引号或单引号括起来,也可以不用引号
  5. 节:用方括号定义,如 [section_name]
  6. 数组:通过添加空方括号表示,如 key[] = value
  7. 常量:可以在值中使用PHP常量,如 path = ROOT_PATH . "/config"

注意事项

  • 文件权限:确保PHP有读取配置文件的权限
  • 文件路径:可以使用相对路径或绝对路径。相对路径相对于当前工作目录
  • 性能:对于频繁读取的配置文件,考虑缓存解析结果
  • 安全性:不要将敏感信息(如密码)存储在Web可访问目录的INI文件中
  • 字符编码:INI文件通常使用UTF-8编码。确保文件编码与解析预期一致
  • 值中的特殊字符:包含空格、等号、分号等特殊字符的值应该用引号括起来
  • 嵌套节:parse_ini_file()不支持嵌套节(节中包含节)

与parse_ini_string()的区别

特性 parse_ini_file() parse_ini_string()
输入源 文件 字符串
第一个参数 文件名(字符串) INI字符串(字符串)
适用场景 从文件读取配置 从数据库、API等读取配置字符串
性能 需要文件I/O操作 不需要文件I/O操作

相关函数