[PHP]php_ini_loaded_file関数の使い方を徹底解説!設定ファイルのパスを取得する方法

PHP

はじめに

PHPの設定を確認する際、「どのphp.iniファイルが読み込まれているのか?」と疑問に思ったことはありませんか?

複数のPHPバージョンが共存していたり、CLI版とWeb版で異なる設定ファイルが使われていたりすると、トラブルシューティングが困難になります。

そんな時に役立つのが**php_ini_loaded_file関数**です。この関数を使えば、現在実行中のPHPがどの設定ファイルを読み込んでいるのかを簡単に確認できます。

この記事では、php_ini_loaded_fileの基本から実践的な活用方法まで、詳しく解説します。

php_ini_loaded_fileとは?

php_ini_loaded_fileは、現在のPHPプロセスが読み込んでいるphp.iniファイルのパスを返す関数です。

基本構文

php_ini_loaded_file(): string|false

パラメータ

この関数はパラメータを取りません。

戻り値

  • 成功時: 読み込まれたphp.iniファイルのフルパス(文字列)
  • 失敗時: php.iniが読み込まれていない場合はfalse

対応バージョン

  • PHP 5.2.4 以降で使用可能

基本的な使い方

シンプルな確認方法

<?php
$ini_file = php_ini_loaded_file();

if ($ini_file) {
    echo "読み込まれているphp.ini: " . $ini_file;
} else {
    echo "php.iniファイルは読み込まれていません";
}

// 実行例(Linux):
// 読み込まれているphp.ini: /etc/php/8.2/cli/php.ini

// 実行例(Windows):
// 読み込まれているphp.ini: C:\php\php.ini
?>

phpinfo()との比較

<?php
// 方法1: php_ini_loaded_file()を使用
echo "php_ini_loaded_file(): " . php_ini_loaded_file() . "\n";

// 方法2: phpinfo()で確認(ブラウザ向け)
// phpinfo(); を実行し、"Loaded Configuration File"の行を確認
?>

実践的な使用例

例1: デバッグ情報の出力

<?php
function displayPhpConfig() {
    echo "=== PHP設定情報 ===\n";
    echo "PHPバージョン: " . PHP_VERSION . "\n";
    echo "読み込まれたphp.ini: " . (php_ini_loaded_file() ?: "なし") . "\n";
    echo "追加の.iniファイル: " . (php_ini_scanned_files() ?: "なし") . "\n";
    echo "メモリ制限: " . ini_get('memory_limit') . "\n";
    echo "最大実行時間: " . ini_get('max_execution_time') . "秒\n";
    echo "エラー表示: " . (ini_get('display_errors') ? 'ON' : 'OFF') . "\n";
}

displayPhpConfig();
?>

例2: 環境判定

<?php
function getPhpEnvironment() {
    $ini_file = php_ini_loaded_file();
    
    if (!$ini_file) {
        return 'no-ini';
    }
    
    // CLIかWebか判定
    if (strpos($ini_file, '/cli/') !== false || strpos($ini_file, '\cli\\') !== false) {
        return 'cli';
    } elseif (strpos($ini_file, '/apache2/') !== false || strpos($ini_file, '/fpm/') !== false) {
        return 'web';
    }
    
    return 'unknown';
}

$env = getPhpEnvironment();
echo "現在の実行環境: {$env}\n";

// CLI: cli
// Apache: web
// PHP-FPM: web
?>

例3: 設定ファイルの存在確認

<?php
function checkPhpIniExists() {
    $ini_file = php_ini_loaded_file();
    
    if (!$ini_file) {
        return [
            'loaded' => false,
            'exists' => false,
            'message' => 'php.iniファイルが読み込まれていません'
        ];
    }
    
    $exists = file_exists($ini_file);
    $readable = is_readable($ini_file);
    
    return [
        'loaded' => true,
        'exists' => $exists,
        'readable' => $readable,
        'path' => $ini_file,
        'size' => $exists ? filesize($ini_file) : 0,
        'modified' => $exists ? date('Y-m-d H:i:s', filemtime($ini_file)) : null
    ];
}

$info = checkPhpIniExists();
print_r($info);
?>

例4: カスタムエラーログ

<?php
function logPhpEnvironment($logfile = 'php_env.log') {
    $info = [
        'timestamp' => date('Y-m-d H:i:s'),
        'php_version' => PHP_VERSION,
        'sapi' => PHP_SAPI,
        'ini_file' => php_ini_loaded_file() ?: 'none',
        'scanned_files' => php_ini_scanned_files() ?: 'none',
        'memory_limit' => ini_get('memory_limit'),
        'upload_max_filesize' => ini_get('upload_max_filesize'),
        'post_max_size' => ini_get('post_max_size')
    ];
    
    $log_entry = json_encode($info, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    file_put_contents($logfile, $log_entry . "\n", FILE_APPEND);
    
    return $info;
}

// 使用例
logPhpEnvironment();
?>

例5: 設定ファイルのバックアップチェック

<?php
function checkPhpIniBackup() {
    $ini_file = php_ini_loaded_file();
    
    if (!$ini_file) {
        return "php.iniが読み込まれていません";
    }
    
    $backup_file = $ini_file . '.bak';
    
    if (file_exists($backup_file)) {
        $original_time = filemtime($ini_file);
        $backup_time = filemtime($backup_file);
        
        if ($original_time > $backup_time) {
            return "警告: php.iniが更新されています。バックアップの更新を検討してください。";
        } else {
            return "バックアップは最新です。";
        }
    } else {
        return "バックアップファイルが見つかりません: {$backup_file}";
    }
}

echo checkPhpIniBackup();
?>

php_ini_scanned_files()との併用

PHPは複数の設定ファイルを読み込むことができます。php_ini_scanned_files()と併用することで、すべての設定ファイルを確認できます。

すべての設定ファイルを取得

<?php
function getAllIniFiles() {
    $files = [];
    
    // メインのphp.ini
    $main_ini = php_ini_loaded_file();
    if ($main_ini) {
        $files['main'] = $main_ini;
    }
    
    // 追加の.iniファイル
    $scanned = php_ini_scanned_files();
    if ($scanned) {
        $scanned_array = explode(',', $scanned);
        $files['additional'] = array_map('trim', $scanned_array);
    }
    
    return $files;
}

$all_files = getAllIniFiles();
echo "メインのphp.ini:\n";
echo $all_files['main'] ?? 'なし';
echo "\n\n追加の.iniファイル:\n";
if (isset($all_files['additional'])) {
    foreach ($all_files['additional'] as $file) {
        echo "  - {$file}\n";
    }
} else {
    echo "なし\n";
}

// 出力例:
// メインのphp.ini:
// /etc/php/8.2/cli/php.ini
//
// 追加の.iniファイル:
//   - /etc/php/8.2/cli/conf.d/10-opcache.ini
//   - /etc/php/8.2/cli/conf.d/20-mysqli.ini
?>

環境別の設定確認

CLI vs Web の違い

<?php
function compareCliWebConfig() {
    $current_ini = php_ini_loaded_file();
    $sapi = PHP_SAPI;
    
    echo "=== 現在の実行環境 ===\n";
    echo "SAPI: {$sapi}\n";
    echo "php.ini: " . ($current_ini ?: 'なし') . "\n\n";
    
    // よくある設定パス
    $common_paths = [
        'CLI (Linux)' => '/etc/php/8.2/cli/php.ini',
        'Apache (Linux)' => '/etc/php/8.2/apache2/php.ini',
        'FPM (Linux)' => '/etc/php/8.2/fpm/php.ini',
        'Windows' => 'C:/php/php.ini'
    ];
    
    echo "=== よくある設定ファイルの場所 ===\n";
    foreach ($common_paths as $type => $path) {
        $exists = file_exists($path) ? '✓ 存在' : '✗ なし';
        echo "{$type}: {$path} [{$exists}]\n";
    }
}

compareCliWebConfig();
?>

Docker環境での確認

<?php
function checkDockerPhpConfig() {
    $ini_file = php_ini_loaded_file();
    
    $info = [
        'container' => gethostname(),
        'ini_file' => $ini_file ?: 'なし',
        'is_docker' => file_exists('/.dockerenv'),
        'php_version' => PHP_VERSION
    ];
    
    if ($info['is_docker']) {
        echo "Docker環境で実行中です\n";
    }
    
    print_r($info);
}

checkDockerPhpConfig();
?>

トラブルシューティング

ケース1: php.iniが読み込まれない

<?php
$ini_file = php_ini_loaded_file();

if ($ini_file === false) {
    echo "問題: php.iniファイルが読み込まれていません\n\n";
    echo "考えられる原因:\n";
    echo "1. PHPがデフォルト設定で実行されている\n";
    echo "2. --no-php-ini オプションで起動された\n";
    echo "3. php.iniファイルが見つからない\n\n";
    
    echo "確認方法:\n";
    echo "1. php --ini コマンドを実行\n";
    echo "2. phpinfo()で確認\n";
    echo "3. which php でPHPのパスを確認\n";
} else {
    echo "php.iniは正常に読み込まれています: {$ini_file}\n";
}
?>

ケース2: 設定が反映されない

<?php
function diagnoseConfigIssue($setting_name) {
    $ini_file = php_ini_loaded_file();
    $current_value = ini_get($setting_name);
    
    echo "=== 設定診断: {$setting_name} ===\n";
    echo "現在の値: " . ($current_value ?: '(空)') . "\n";
    echo "読み込まれたphp.ini: " . ($ini_file ?: 'なし') . "\n";
    
    if ($ini_file && file_exists($ini_file)) {
        // php.iniの内容を検索
        $content = file_get_contents($ini_file);
        if (preg_match("/^{$setting_name}\s*=\s*(.+)$/m", $content, $matches)) {
            echo "php.ini内の設定: {$matches[1]}\n";
        } else {
            echo "php.ini内に設定が見つかりません\n";
        }
        
        // 追加の.iniファイルも確認
        $scanned = php_ini_scanned_files();
        if ($scanned) {
            echo "\n追加の.iniファイルも確認してください:\n";
            $files = explode(',', $scanned);
            foreach ($files as $file) {
                echo "  - " . trim($file) . "\n";
            }
        }
    }
    
    echo "\n.htaccessやini_set()で上書きされている可能性もあります\n";
}

// 使用例
diagnoseConfigIssue('memory_limit');
?>

ケース3: 権限の問題

<?php
function checkIniPermissions() {
    $ini_file = php_ini_loaded_file();
    
    if (!$ini_file) {
        return "php.iniが読み込まれていません";
    }
    
    $perms = fileperms($ini_file);
    $owner = posix_getpwuid(fileowner($ini_file));
    $group = posix_getgrgid(filegroup($ini_file));
    
    echo "ファイル: {$ini_file}\n";
    echo "パーミッション: " . substr(sprintf('%o', $perms), -4) . "\n";
    echo "所有者: {$owner['name']}\n";
    echo "グループ: {$group['name']}\n";
    echo "読み取り可能: " . (is_readable($ini_file) ? 'はい' : 'いいえ') . "\n";
    echo "書き込み可能: " . (is_writable($ini_file) ? 'はい' : 'いいえ') . "\n";
}

// Linuxでのみ動作
if (function_exists('posix_getpwuid')) {
    checkIniPermissions();
}
?>

セキュリティ上の注意点

本番環境での情報露出を防ぐ

<?php
// 悪い例: 本番環境で設定情報を表示
if ($_GET['debug'] ?? false) {
    echo "php.ini: " . php_ini_loaded_file();  // 危険!
}

// 良い例: 開発環境でのみ表示
function displayConfigInfo() {
    // 環境変数で制御
    $is_dev = ($_ENV['APP_ENV'] ?? 'production') === 'development';
    
    if (!$is_dev) {
        return "本番環境では設定情報を表示できません";
    }
    
    $ini_file = php_ini_loaded_file();
    return [
        'ini_file' => $ini_file,
        'php_version' => PHP_VERSION,
        'environment' => 'development'
    ];
}
?>

IPアドレス制限

<?php
function displayConfigSecure() {
    // 許可されたIPアドレスのみ
    $allowed_ips = ['127.0.0.1', '::1', '192.168.1.100'];
    $client_ip = $_SERVER['REMOTE_ADDR'] ?? '';
    
    if (!in_array($client_ip, $allowed_ips)) {
        http_response_code(403);
        die('アクセス拒否');
    }
    
    echo "php.ini: " . php_ini_loaded_file() . "\n";
}
?>

実用的なツール作成

PHPインフォメーションページ

<?php
// admin_phpinfo.php
function generatePhpInfoPage() {
    $ini_file = php_ini_loaded_file();
    $scanned_files = php_ini_scanned_files();
    
    $html = <<<HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PHP設定情報</title>
    <style>
        body { font-family: sans-serif; margin: 20px; }
        .section { margin: 20px 0; padding: 15px; background: #f5f5f5; border-radius: 5px; }
        .label { font-weight: bold; }
        .value { color: #0066cc; }
    </style>
</head>
<body>
    <h1>PHP設定情報</h1>
    
    <div class="section">
        <h2>基本情報</h2>
        <p><span class="label">PHPバージョン:</span> <span class="value">%s</span></p>
        <p><span class="label">SAPI:</span> <span class="value">%s</span></p>
        <p><span class="label">読み込まれたphp.ini:</span> <span class="value">%s</span></p>
    </div>
    
    <div class="section">
        <h2>追加の設定ファイル</h2>
        <pre>%s</pre>
    </div>
    
    <div class="section">
        <h2>主要な設定値</h2>
        <p><span class="label">memory_limit:</span> <span class="value">%s</span></p>
        <p><span class="label">max_execution_time:</span> <span class="value">%s秒</span></p>
        <p><span class="label">upload_max_filesize:</span> <span class="value">%s</span></p>
        <p><span class="label">post_max_size:</span> <span class="value">%s</span></p>
    </div>
</body>
</html>
HTML;
    
    return sprintf(
        $html,
        PHP_VERSION,
        PHP_SAPI,
        $ini_file ?: 'なし',
        $scanned_files ?: 'なし',
        ini_get('memory_limit'),
        ini_get('max_execution_time'),
        ini_get('upload_max_filesize'),
        ini_get('post_max_size')
    );
}

// 開発環境でのみ実行
if (($_ENV['APP_ENV'] ?? 'production') === 'development') {
    echo generatePhpInfoPage();
}
?>

まとめ

php_ini_loaded_fileは、PHPの設定ファイルのパスを確認するためのシンプルで重要な関数です。

主な用途:

  • ✅ トラブルシューティング時の設定確認
  • ✅ 環境別の設定ファイルの特定
  • ✅ デバッグ情報の収集
  • ✅ 設定の自動診断ツールの作成

重要なポイント:

  • CLI版とWeb版で異なるphp.iniが読み込まれることがある
  • php_ini_scanned_files()と併用してすべての設定ファイルを確認
  • 本番環境では設定情報の露出に注意
  • falseが返る場合はphp.iniが読み込まれていない

おすすめの確認方法:

  1. コマンドライン: php --ini
  2. PHPコード: php_ini_loaded_file()
  3. Webページ: phpinfo()

この関数を活用して、PHPの設定管理とトラブルシューティングを効率化しましょう!

参考リンク


この記事が役に立ったら、ぜひシェアしてください!

タイトルとURLをコピーしました