Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】INI_PERDIR定数の使い方

INI_PERDIR定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

INI_PERDIR定数は、PHPの実行時設定項目がどこで変更可能であるかを示すモードの一つです。この定数は、特定の設定項目がphp.iniファイル、Apacheのhttpd.confファイル、または.htaccessファイルで変更可能であることを表します。

具体的には、Webサーバーの全体設定ファイルであるhttpd.confや、特定のディレクトリに適用される.htaccessファイルを通じて、PHPの設定値を調整できることを意味します。これにより、サーバー管理者やサイト管理者は、Webサーバーの構成に基づいたきめ細やかなPHPの動作制御を行うことが可能です。

しかし、このINI_PERDIRモードが指定された設定項目は、PHPスクリプトの実行中にini_set()関数を使用して値を変更することはできません。設定は、スクリプトが実行されるよりも前の段階で、前述のファイルを通じて適用されている必要があります。

この定数を理解することで、PHPの設定項目がどのような方法で、どの範囲で変更できるのかを正確に把握することができます。これは、PHPアプリケーションの動作に影響を与える設定の管理、システムのセキュリティ強化、およびパフォーマンスチューニングを行う上で非常に重要な知識となります。例えば、Webサーバーレベルで制御すべきセキュリティ設定やリソースに関する設定項目がこのモードを持つことがあります。

構文(syntax)

1<?php
2echo INI_PERDIR;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

INI_PERDIRは、PHPの設定ファイル(php.ini)で指定されたディレクティブのスコープを示す定数です。この定数は、そのディレクティブがディレクトリごとに設定可能であることを意味します。

サンプルコード

PHP INI_PERDIR 定数のアクセスレベルを判定する

1<?php
2
3/**
4 * PHPのINI_PERDIR定数の利用例を示す関数。
5 *
6 * INI_PERDIRは、PHPの設定が.htaccessファイルやhttpd.confファイルといった
7 * 「ディレクトリ単位」で変更可能であることを示すビットマスク定数です。
8 * この関数は、指定されたPHP設定がINI_PERDIRレベルで変更可能かどうかを判定し、
9 * その結果を分かりやすく表示します。
10 *
11 * システムエンジニアを目指す初心者の方へ:
12 * PHPの設定には、どこで変更できるかの「アクセスレベル」が定められています。
13 * INI_PERDIRは、ウェブサーバーの設定ファイル(.htaccessなど)で変更できる設定を示す目印の一つです。
14 * 例えば、ファイルのアップロードサイズ制限を変更したい場合、それがINI_PERDIRであれば
15 * .htaccessで簡単に調整できることを意味します。
16 *
17 * @param string $settingName 確認したいINI設定の名前(例: 'upload_max_filesize')
18 * @return void
19 */
20function demonstrateIniPerdirUsage(string $settingName): void
21{
22    // PHPのすべてのINI設定情報を取得します。
23    // 各設定には、その設定がどの場所(システム全体、ディレクトリ単位など)で
24    // 変更可能かを示す'access'というキーが含まれています。
25    $iniSettings = ini_get_all();
26
27    // 指定されたINI設定がPHPの構成に見つからない場合、エラーメッセージを表示して終了します。
28    if (!isset($iniSettings[$settingName])) {
29        echo "エラー: 指定されたINI設定 '{$settingName}' は見つかりませんでした。\n";
30        return;
31    }
32
33    // 指定された設定のアクセスレベル(ビットマスク値)を取得します。
34    $accessLevel = $iniSettings[$settingName]['access'];
35
36    // INI_PERDIR定数とビットAND演算子 (&) を使用して、
37    // その設定がINI_PERDIRレベルで変更可能かどうかをチェックします。
38    // (アクセスレベル & INI_PERDIR) の結果が INI_PERDIR と等しい場合、
39    // その設定は.htaccessなどで変更できることを意味します。
40    if (($accessLevel & INI_PERDIR) === INI_PERDIR) {
41        echo "INI設定 '{$settingName}' は、.htaccessまたはhttpd.confで変更可能です (INI_PERDIR)。\n";
42    } else {
43        echo "INI設定 '{$settingName}' は、.htaccessまたはhttpd.confでは変更できません (INI_PERDIRではありません)。\n";
44    }
45}
46
47// ----- サンプル実行例 -----
48
49// 例1: ファイルのアップロードサイズ制限 ('upload_max_filesize') がINI_PERDIRで変更可能かを確認。
50// これは一般的に.htaccessで変更可能な設定です。
51demonstrateIniPerdirUsage('upload_max_filesize');
52
53// 例2: エラー報告レベル ('error_reporting') がINI_PERDIRで変更可能かを確認。
54// これも一般的に.htaccessで変更可能な設定です。
55demonstrateIniPerdirUsage('error_reporting');
56
57// 例3: セッションの保存ハンドラ ('session.save_handler') がINI_PERDIRで変更可能かを確認。
58// この設定は通常、システムレベル(PHPの設定ファイルなど)でのみ変更可能であり、
59// .htaccessでは変更できないことが多いです。
60demonstrateIniPerdirUsage('session.save_handler');
61
62// 例4: 存在しないINI設定を指定した場合の挙動を確認。
63demonstrateIniPerdirUsage('non_existent_php_setting');
64

PHPのINI_PERDIR定数は、PHPの設定項目がウェブサーバーの設定ファイル(例:.htaccesshttpd.conf)でディレクトリ単位に上書き可能であるかを示す整数値です。PHPには様々な設定変更方法がありますが、この定数はそのうち「ディレクトリごとに設定できるか」というアクセスレベルを表します。

提供されたサンプルコードは、特定のPHP設定がINI_PERDIRレベルで変更可能かどうかを判定し、その結果を画面に出力するdemonstrateIniPerdirUsage関数を提供しています。この関数は、確認したいPHP設定の名前を文字列として引数$settingNameに受け取ります。戻り値はvoidで、処理結果を直接表示します。

関数内部では、まずini_get_all()で現在のPHP設定を全て取得します。次に、指定された設定項目のアクセスレベルを抽出し、INI_PERDIR定数とのビットAND演算(&)を用いて比較します。この比較により、設定が.htaccessなどで変更可能であれば「変更可能です」と、そうでなければ「変更できません」と分かりやすく表示します。この定数を利用することで、システムエンジニアはどの設定がどの範囲で変更できるかを正確に判断し、システム構築や運用時の設定管理に役立てることができます。

INI_PERDIRはPHP設定のアクセスレベルを示し、設定値そのものではありません。この定数は、.htaccesshttpd.confといったディレクトリ単位での設定変更が可能かを確認するために使われます。サンプルコードでは、ini_get_all()で取得した設定のアクセスレベルとINI_PERDIRをビットAND演算子(&)で比較しています。このビット演算による判定方法を理解することが重要です。設定がINI_PERDIRで変更可能と判断されても、実際の変更は別途.htaccessphp.iniを編集して行います。このコードは変更の可否を「確認する」だけで、設定値を直接変更するものではありません。PHPのバージョンやサーバー環境によりアクセスレベルが異なる場合があるのでご注意ください。

関連コンテンツ