parse_ini_file

設定ファイルをパースする

説明

arrayfalse parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL)

parse_ini_file は、 filename で指定した ini ファイルをロードし、 連想配列としてその設定値を返します。

ini ファイルの構造は、php.ini の構造と同じです。

パラメータ

filename

パースしたい ini ファイルのファイル名。 相対パスが指定された場合、 現在のディレクトリから相対的な位置として評価され、 さらに include_path からファイルを探します。

process_sections

process_sections パラメータに true を設定すると、セクション名と設定が含まれた多次元の配列を得ることができます。 デフォルトでは、process_sectionsfalse です。

scanner_mode

INI_SCANNER_NORMAL (デフォルト) あるいは INI_SCANNER_RAWINI_SCANNER_RAW を指定すると、オプションの値はパースされません。

PHP 5.6.1 以降では INI_SCANNER_TYPED も指定できるようになりました。 このモードでは、boolean や null そして integer の型を、可能な限り維持します。 文字列 "true""on" そして "yes"true に変換されます。"false""off""no" そして "none"false だとみなされます。このモードでは、"null"null に変換されます。また数値形式の文字列も、可能な限り integer 型に変換されます。

戻り値

成功した場合に設定を連想配列形式で返します。 失敗した場合に false を返します。

例1 sample.ini の内容

; これは設定ファイルのサンプルです。
; php.ini と同様、';' で始まる行はコメントです。

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"

例2 parse_ini_file の例

定数 (但し __FILE__ のような "マジック定数" は除く) も ini ファイル上でパースされます。 そのため、parse_ini_file をコールする前に ini ファイル上の値として定数を定義した場合、戻り値に統合されます。 ini ファイル上の値だけが評価されます。この値は定数でなければなりません。以下は例です:

<?php

define('BIRD', 'Dodo bird');

// セクションを無視してパースします。
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);

// セクションを意識してパースします。
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

?>

上の例の出力は、 たとえば以下のようになります。

Array
(
    [one] => 1
    [five] => 5
    [animal] => Dodo bird
    [path] => /usr/local/bin
    [URL] => http://www.example.com/~username
    [phpversion] => Array
        (
            [0] => 5.0
            [1] => 5.1
            [2] => 5.2
            [3] => 5.3
        )

    [urls] => Array
        (
            [svn] => http://svn.php.net
            [git] => http://git.php.net
        )

)
Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

    [third_section] => Array
        (
            [phpversion] => Array
                (
                    [0] => 5.0
                    [1] => 5.1
                    [2] => 5.2
                    [3] => 5.3
                )

            [urls] => Array
                (
                    [svn] => http://svn.php.net
                    [git] => http://git.php.net
                )

        )

)

例3 parse_ini_file による php.ini ファイルのパース

<?php
// 以下の結果を比較するための簡単な関数
function yesno($expression)
{
    return($expression ? 'Yes' : 'No');
}

// php.ini へのパスを the php_ini_loaded_file() 関数で取得します
$ini_path = php_ini_loaded_file();

// php.ini をパースします
$ini = parse_ini_file($ini_path);

// 結果を表示して比較します。get_cfg_var() を使用すると、
// ここでパースして読み込んだのと同じ結果が得られることに注意しましょう
echo '(parsed) magic_quotes_gpc = ' . yesno($ini['magic_quotes_gpc']) . PHP_EOL;
echo '(loaded) magic_quotes_gpc = ' . yesno(get_cfg_var('magic_quotes_gpc')) . PHP_EOL;
?>

上の例の出力は、 たとえば以下のようになります。

(parsed) magic_quotes_gpc = Yes
(loaded) magic_quotes_gpc = Yes

例4 ini ファイルの値の補完

定数を評価することに加えて、文字によっては ini ファイルの値として特別な意味を持つものがあります。 さらに、環境変数や以前定義された設定オプション (get_cfg_var も参照ください) は、 ${} を使って読み取ることができます。

; | は ビット演算の OR
is used for bitwise OR
three = 2|3

; & は ビット演算の AND
four = 6&5

; ^ は ビット演算の XOR
five = 3^6

; ~ は ビット演算の NOT
negative_two = ~1

; () はグループ化に使います
seven = (8|7)&(6|5)

; 環境変数 PATH を展開します
path = ${PATH}

; 設定オプション 'memory_limit' を展開します
configured_memory_limit = ${memory_limit}

例5 文字をエスケープする

文字によっては、ダブルクォートで囲まれた文字列の中で特別な意味を持つ場合があり、 その場合、バックスラッシュでエスケープしなければなりません。 特別な意味を持つのは、文字列の境目の印となるダブルクォート "、 および、バックスラッシュ \ (この文字の後に特別な文字がひとつ続きます) そのものです。

quoted = "She said \"Exactly my point\"." ; Results in a string with quote marks in it.
hint = "Use \\\" to escape double quote" ; Results in: Use \" to escape double quote

Windows ライクなパスについては例外があります。 クォートされた文字列のすぐ後に改行文字が続いた場合、 末尾のバックスラッシュはエスケープする必要がないというものです。

save_path = "C:\Temp\"

複数行にまたがる値で、改行文字が直後にあるダブルクォート文字をエスケープする必要がある場合、 次のようにして値を連結することでそれを実現できます。 (ダブルクォートで囲まれた文字列がひとつあり、その直後にもうひとつの文字列が続きます)

long_text = "Lorem \"ipsum\"""
 dolor" ; Results in: Lorem "ipsum"\n dolor

特別な意味を持つ別の文字として、$ (ドル記号) があります。 これは、開き括弧が続く場合、エスケープしなければいけません:

code = "\${test}"

文字のエスケープは、 INI_SCANNER_RAW モードではサポートされていません。 (このモードでは、全ての文字が "そのまま" 処理されます)

ini ファイルのパーサーは、標準的なエスケープシーケンス (\n, \t, など) をサポートしていないことに注意して下さい。 そのサポートが必要な場合、parse_ini_file の処理結果を stripcslashes で処理するようにして下さい。

注意

注意:

この関数は、php.ini ファイルには何もしません。 このファイルはスクリプトを実行している時には既に処理されています。 この関数は、アプリケーション個有の設定ファイルを読み込む際に使用可能です。

注意:

ini ファイル上の値に英数字ではないものがある場合、 ダブルクォート(")で囲う必要があります。

注意: ini ファイル上でキーとして使ってはいけない単語があります。 null, yes, no, true, false, on, off, none などです。 null, off, no および false"" となり、 on, yes および true"1" となります。 ただし、INI_SCANNER_TYPED モードを使っている場合は別です。 次の文字 ?{}|&~!()^" は、キーで使ってはいけません。 また、値の中で特別な意味を持ちます。

注意:

等号が含まれないエントリは無視されます。 つまり、"foo" というエントリは無視されますが、 "bar =" は、空の値を持つエントリとして追加されます。 たとえば MySQL の my.cnf には "no-auto-rehash" という設定項目がありますが、この項目には何も値を設定しません。 そのため、この項目は無視されます。

注意:

ini ファイルは、一般的にWebサーバーからはプレーンテキストとして扱われます。 よって、ini ファイルにリクエストがあった場合、ブラウザにそのまま表示されます。 これは、セキュリティを考慮すると、 ini ファイルはドキュメントルートの外側に置くか、 Webサーバーがそれを返さないように設定を変更しなければならないということです。 そうしないと、セキュリティ上のリスクが発生する可能性があります。

参考

  • parse_ini_string