8.

INI(.ini)の完全ガイド — [section] と key=value・php.ini・systemd・configparser

編集
この記事の要点
  • INI ファイルは [section] と key=value で構成される古典的設定形式
  • MS-DOS / Windows 由来。win.ini / system.ini で OS 設定に使われた歴史を持つ
  • コメントは ; (Windows 流)または # (UNIX 流)。実装によって微妙に異なる
  • 正式な標準仕様はなく、パーサごとに方言(マルチライン値・型推論など)がある
  • Python の configparser、PHP の parse_ini_file が代表的なパーサ
  • php.ini・systemd unit ファイル・.gitconfig・Windows のレガシー設定で今も現役

概要

INI ファイル(initialization file)は、[section] ヘッダと key = value 形式の行で設定を表現する、シンプルで古典的なテキスト設定形式です。MS-DOS 〜 Windows 3.x 時代に win.inisystem.inicontrol.ini などとして OS の主要設定に使われていたのが起源で、Windows 95 以降は中央集権的なレジストリに移行しましたが、形式自体は 今もアプリケーション設定の定番 として残っています。

拡張子は .ini が代表的ですが、内容が同形式でも .cfg.conf.gitconfig.editorconfigphp.ini・systemd の .service など、さまざまな拡張子で使われます。正式な国際標準仕様は存在しないため、パーサ実装ごとに方言があるのが最大の特徴です。

構文・データモデル

典型的な INI ファイル:

; これは Windows 流コメント
# これは UNIX 流コメント(実装依存)

[database]
host = localhost
port = 3306
user = admin
password = "p@ss word"

[logging]
level = info
file  = /var/log/app.log

[features]
enable_cache = true
max_connections = 100

systemd unit ファイル(INI 形式の現代的な実例):

[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=myapp
ExecStart=/usr/bin/myapp --port 8080
Restart=on-failure

[Install]
WantedBy=multi-user.target

データモデルは「section → key → value(基本は文字列)」というほぼフラットな 2 階層構造です。ネスト・配列・型は仕様レベルでは存在せず、必要なら値の文字列をカンマ区切りでパースするなど実装側で工夫します。

主な用途

  • php.ini: PHP の動作設定(メモリ上限・タイムゾーン・拡張モジュール)
  • systemd unit ファイル: /etc/systemd/system/*.service*.timer*.socket
  • .gitconfig: Git のユーザー設定(INI に似た独自方言)
  • .editorconfig: エディタ間で共有するインデント・改行設定
  • Python の setup.cfg: パッケージ・Linter(flake8 など)の設定
  • Windows レガシーアプリ: ゲームの config.ini 等、いまだ現役
  • MySQL my.cnf / PostgreSQL postgresql.conf の一部

関連形式との比較

項目INITOMLYAMLJSON
標準仕様なし(方言だらけ)v1.0.0 で確立YAML 1.2.2RFC 8259
コメント可(; / #可(#可(#不可
すべて文字列豊富(日時含む)豊富(暗黙変換あり)6 種類
ネスト基本不可テーブルで可インデントで可
歴史1980 年代〜2013 年〜2001 年〜2001 年〜
主用途レガシー設定全般近代的設定CI・IaCAPI・データ交換

TOML は「INI の良さを残しつつ厳密に再設計した後継」と位置付けると整理しやすいでしょう。

編集・パーサ・ツール

  • Python configparser: 標準ライブラリ。configparser.ConfigParser() で読み書き、補間(%(key)s)に対応
  • PHP parse_ini_file() / parse_ini_string(): 標準関数で INI を配列として読める
  • Node.js: ini(npm)、rc
  • Go: gopkg.in/ini.v1(go-ini)
  • Rust: rust-ini
  • VS Code: 多くの拡張子(.ini / .conf / .service)でシンタックスハイライト対応
  • テキストエディタなら何でも編集可能: シンプルゆえに最強の互換性を持つ

注意点・落とし穴

  • 標準仕様がない: コメント記号(; vs #)、クォートの扱い、マルチライン値、サブセクションなどパーサごとに違う。複数パーサで共有する INI を書くときは保守的に
  • キーが大文字小文字を区別するかは実装依存: configparser はデフォルトで小文字化する
  • 値はすべて文字列: port = 3306 もパーサ内では "3306"getint() / getboolean() など型変換 API を使う
  • セクション外のキーの扱い: 一部実装は [DEFAULT] に入れる、別の実装はエラーになる
  • セクション重複・キー重複: マージするか後勝ちかパーサ依存
  • 機密情報: php.ini に DB パスワードを直書きするのは避け、.env や OS の環境変数経由で渡す
  • ネストしたい誘惑: [parent.child] のようなドット区切りで階層を表現する方言があるが、互換性は低い。階層が必要なら TOML / YAML に移行する方が健全

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTML(.html / .htm)
  2. CSS(.css)
  3. JSON(.json)
  4. XML(.xml)
  5. YAML(.yaml / .yml)
  6. TOML(.toml)
  7. env(.env)
  8. INI(.ini)
  9. properties(.properties)
  10. conf(.conf)

最近更新/作成されたページ