タイトル: php.ini
SEOタイトル: PHP php.ini 設定完全ガイド (場所/memory_limit/upload/error_reporting)
| この記事の要点 |
|
php.ini の場所を特定する
# CLI から確認 (一番速い)
php --ini
# Configuration File (php.ini) Path: /etc/php/8.3/cli
# Loaded Configuration File: /etc/php/8.3/cli/php.ini
# Scan for additional .ini files in: /etc/php/8.3/cli/conf.d
# Additional .ini files parsed: /etc/php/8.3/cli/conf.d/10-opcache.ini ...
# phpinfo() でブラウザから (Apache / FPM)
echo ' /var/www/html/info.php
# → "Loaded Configuration File" を確認 (本番では削除)
# php_ini_loaded_file()
php -r "echo php_ini_loaded_file();"
# 適用済 conf.d (拡張別) 一覧
php -r "echo php_ini_scanned_files();" | tr ',' '\n'
Server API ごとに別ファイル
| SAPI | 典型パス (Debian/Ubuntu) | 用途 |
|---|---|---|
| CLI | /etc/php/8.3/cli/php.ini | php script.php 実行時 |
| Apache mod_php | /etc/php/8.3/apache2/php.ini | Apache + mod_php |
| PHP-FPM | /etc/php/8.3/fpm/php.ini | Nginx + PHP-FPM |
| RHEL系 | /etc/php.ini 単一 | CentOS / Rocky 等 |
| macOS Homebrew | /opt/homebrew/etc/php/8.3/php.ini | brew install php |
| Windows | C:\php\php.ini | 通常 PHP インストールフォルダ |
注意: Web (Apache/FPM) と CLI で別ファイルなので、php script.php で動いた設定が Web では効かないことがあります。
必ず押さえる主要設定
; === メモリ・実行時間 ===
memory_limit = 256M ; 1 スクリプトあたりの上限
max_execution_time = 30 ; CLI は 0 (無制限)
max_input_time = 60 ; リクエストパース時間
; === アップロード ===
file_uploads = On
upload_max_filesize = 20M
post_max_size = 25M ; ★ upload_max_filesize より大きく
max_file_uploads = 20
; === エラー表示 ===
error_reporting = E_ALL
display_errors = Off ; ★ 本番は必ず Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log
; === タイムゾーン ===
date.timezone = Asia/Tokyo
; === 文字 ===
default_charset = "UTF-8"
; === セッション ===
session.cookie_httponly = 1
session.cookie_secure = 1 ; HTTPS のみ
session.use_strict_mode = 1
session.gc_maxlifetime = 1440 ; 24分
; === OPcache (本番ほぼ必須) ===
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1 ; 本番は 0 + デプロイで cache_invalidate
upload_max_filesize と post_max_size の関係
リクエスト全体サイズ ≤ post_max_size
個別ファイルサイズ ≤ upload_max_filesize
合計ファイルサイズ ≤ post_max_size
例: 20MB のファイルをアップロードしたい
upload_max_filesize = 20M
post_max_size = 25M ← upload より大きく (フォームデータ分余裕)
memory_limit = 256M ← post の数倍が安全
CGI / FastCGI 経由ではさらに上流 (Nginx) の制限あり
client_max_body_size 25M; ← Nginx 側
error_reporting の組み合わせ
| 設定 | 意味 |
|---|---|
E_ALL | 全てのエラー (推奨) |
E_ALL & ~E_DEPRECATED | 非推奨警告を抑制 |
E_ALL & ~E_NOTICE | 軽微な通知を抑制 |
E_ERROR | E_WARNING | E_PARSE | 致命系のみ |
0 | すべて非表示 (非推奨) |
.htaccess での上書き (Apache)
# .htaccess (Apache + mod_php)
php_value memory_limit 512M
php_value max_execution_time 60
php_value upload_max_filesize 50M
php_value post_max_size 55M
php_flag display_errors off
php_flag log_errors on
php_value error_log /var/log/php/app-error.log
# php_value : 文字列 / 数値
# php_flag : on/off
★PHP-FPM (Nginx) では .htaccess の php_value は効きません。FPM プールの php_admin_value を使います:
; /etc/php/8.3/fpm/pool.d/www.conf
[www]
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 55M
php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php/app-error.log
ini_set() でランタイム変更
// スクリプト内で一時的に変更
ini_set('memory_limit', '512M');
ini_set('max_execution_time', 60);
set_time_limit(60); // max_execution_time のリセット
// 値の取得
$current = ini_get('memory_limit'); // '256M'
// 全設定取得
$all = ini_get_all();
// PHP_INI_SYSTEM (php.ini のみ変更可) は ini_set 不可
ini_set('disable_functions', ''); // ← 効かない
// よく使う一時設定
ini_set('display_errors', '1'); // デバッグ時
ini_set('log_errors', '1');
ini_set('error_log', __DIR__ . '/debug.log');
変更権限レベル
| レベル | 変更可能な場所 |
|---|---|
PHP_INI_SYSTEM | php.ini のみ (例: disable_functions) |
PHP_INI_PERDIR | php.ini / .htaccess / .user.ini |
PHP_INI_USER | 上 + ini_set() |
PHP_INI_ALL | すべて |
変更を反映する
# CLI: 即時反映 (次のコマンドから)
# Apache + mod_php
sudo systemctl restart apache2
# または graceful
sudo systemctl reload apache2
# PHP-FPM
sudo systemctl reload php8.3-fpm
# 確認
php -i | grep memory_limit
# memory_limit => 256M => 256M
本番でよくある設定パターン
; 本番推奨
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL & ~E_DEPRECATED
; セキュリティ
expose_php = Off ; X-Powered-By 隠す
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
allow_url_fopen = Off ; 可能なら
allow_url_include = Off ; 必須
; パフォーマンス
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.validate_timestamps = 0 ; デプロイ時に opcache_reset
realpath_cache_size = 4096K
realpath_cache_ttl = 600
FAQ
Q: php.ini 変更が反映されない
A: SAPI を間違えていないか確認。Apache/FPM は再起動が必要。php -i | grep "Loaded Configuration" で実際に読まれているファイルを確認。
Q: ホスティングサービスで php.ini を変更できない
A: .user.ini や .htaccess で対応可能なものも。PHP_INI_PERDIR 以下のディレクティブのみ。
Q: docker の PHP イメージで設定を上書きするには?
A: /usr/local/etc/php/conf.d/zz-custom.ini に COPY するのが定石。php.ini-production をベースに変更点だけ上書き。