20.

PHP php.ini 設定完全ガイド (場所/memory_limit/upload/error_reporting)

編集
この記事の要点
  • php.ini は PHP の挙動を制御する設定ファイル。場所は php --ini で確認
  • Server API ごとに別ファイル: cli/php.ini / apache2/php.ini / fpm/php.ini
  • 主要設定: memory_limit / max_execution_time / post_max_size / upload_max_filesize / error_reporting / display_errors / log_errors / timezone
  • .htaccessphp_valueini_set() でランタイム上書き可能
  • 現在の有効設定は phpinfo() で確認

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 '<?php phpinfo();' > /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.iniphp script.php 実行時
Apache mod_php/etc/php/8.3/apache2/php.iniApache + mod_php
PHP-FPM/etc/php/8.3/fpm/php.iniNginx + PHP-FPM
RHEL系/etc/php.ini 単一CentOS / Rocky 等
macOS Homebrew/opt/homebrew/etc/php/8.3/php.inibrew install php
WindowsC:\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) では .htaccessphp_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_SYSTEMphp.ini のみ (例: disable_functions)
PHP_INI_PERDIRphp.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.iniCOPY するのが定石。php.ini-production をベースに変更点だけ上書き。

編集
Post Share
子ページ
  1. ファイルの場所
  2. コメントアウトの仕方
同階層のページ
  1. インストール方法
  2. 文法
  3. Composerのインストール
  4. 内部関数
  5. フレームワーク
  6. エラー一覧
  7. 改行出力
  8. printとechoの違い
  9. シングルクォートとダブルクォートの違い
  10. returnとyieldの違い
  11. var_dumpをログ出力
  12. CSV読み込み
  13. 待機・処理の遅延
  14. ログファイルにエラーを出力する方法
  15. エラーログ出力関数
  16. URLパラメータの配列化
  17. empty, is_null. issetの判定比較表
  18. httpステータスコードの付与
  19. バージョンの確認
  20. php.ini
  21. APIを呼び出す方法
  22. 外部ファイルを呼び出す方法
  23. カンマ区切りの文字列を配列に変換
  24. 配列からランダムに値を取り出す方法
  25. Webスクレイピング

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