タイトル: エラー一覧
SEOタイトル: PHP よくあるエラー集と対処完全ガイド(Fatal/Parse/Memory/Undefined)
| この記事の要点 |
|
PHP のエラー分類
PHP のエラーは大きく分けて パースエラー (Parse error)、致命的エラー (Fatal error)、警告 (Warning)、通知 (Notice)、Deprecated の 5 種類があります。PHP 7 と PHP 8 では昇格度合いが異なるので注意が必要です。
| 分類 | 意味 | スクリプト継続 |
|---|---|---|
E_PARSE | 構文解析エラー | 停止 (実行されない) |
E_ERROR | 致命的な実行時エラー | 停止 |
E_WARNING | 警告 | 継続 |
E_NOTICE | 通知レベル | 継続 |
E_DEPRECATED | 非推奨機能の使用 | 継続 |
E_USER_ERROR 等 | ユーザ定義エラー | trigger_error() で発火 |
1. Fatal error: Call to undefined function
Fatal error: Uncaught Error: Call to undefined function mb_strlen() in /var/www/index.php:10
原因: 関数が存在しない or 拡張モジュール未インストール。
mb_strlen()なら mbstring 拡張が未インストールcurl_init()なら php-curl パッケージ未導入- 自前関数のスペルミス / ファイル未 require
- 名前空間ミス (
use忘れ or FQCN ミス)
# 拡張モジュール確認
php -m | grep -i mbstring
# Ubuntu/Debian で追加
sudo apt install php-mbstring php-curl php-xml php-gd
sudo systemctl restart php8.2-fpm
# 関数の存在確認
php -r 'var_dump(function_exists("mb_strlen"));'
2. Parse error: syntax error, unexpected ...
Parse error: syntax error, unexpected token ";", expecting "," or ")" in /var/www/index.php on line 15
原因: 構文ミス。多くはカンマ漏れ / セミコロン漏れ / 閉じカッコの不一致。
// NG: 配列の末尾以外のカンマ漏れ
$arr = [
'a' => 1
'b' => 2, // 上の行に , が無い
];
// NG: 文字列内の引用符エスケープ漏れ
$sql = "SELECT * FROM users WHERE name = 'O'Brien'"; // ' で閉じてしまう
// 確認コマンド
// php -l index.php → No syntax errors detected または該当行
3. Allowed memory size of N bytes exhausted
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 20480 bytes) in /var/www/index.php on line 30
原因: PHP プロセスが memory_limit を超えるメモリを要求。大量のデータ読込・無限ループ的な配列追記など。
; php.ini で全体設定
memory_limit = 256M// スクリプト内で個別設定
ini_set('memory_limit', '512M');
// 大量データはストリーミング処理に
$fp = fopen('huge.csv', 'r');
while (($row = fgetcsv($fp)) !== false) {
// 1 行ずつ処理 (全件読み込みは禁忌)
}
fclose($fp);
// Eloquent で chunk() を使う
User::chunk(1000, function ($users) {
foreach ($users as $user) { /* ... */ }
});
4. Undefined index / Undefined variable
// PHP 7
Notice: Undefined index: name in /var/www/index.php on line 8
// PHP 8
Warning: Undefined array key "name" in /var/www/index.php on line 8
Warning: Undefined variable $foo in /var/www/index.php on line 12
PHP 8 で E_NOTICE → E_WARNING に昇格しました。本番でエラーが顕在化しやすくなったので、Null 合体演算子で対処します:
// NG
$name = $_POST['name'];
// OK (Null Coalescing - PHP 7+)
$name = $_POST['name'] ?? '';
// OK (isset 判定)
$name = isset($_POST['name']) ? $_POST['name'] : '';
// 配列ヘルパー
$name = data_get($_POST, 'user.name', ''); // Laravel
5. Headers already sent by ...
Warning: Cannot modify header information - headers already sent by
(output started at /var/www/header.php:3) in /var/www/login.php on line 10
原因: header() や setcookie() や session_start() より前に何かが出力された (空白、BOM、echo、HTML タグ)。
- PHP ファイル先頭の BOM 付き UTF-8 が出力扱いされる → BOM 無し UTF-8 で保存
?>閉じタグの後ろの空白や改行 → 閉じタグ自体を省略すれば防げる- 意図しない
echo/print_rのデバッグ残骸
<?php
// NG: 出力後にヘッダ
echo "Hello";
header('Location: /next'); // ← 既に echo で出力済
// OK: ob_start() で出力バッファ
ob_start();
echo "Hello";
header('Location: /next');
ob_end_flush();
6. Class not found (autoload)
Fatal error: Uncaught Error: Class "App\Services\UserService" not found
原因: Composer のオートロードが効いていない。
# autoload 再生成
composer dump-autoload -o
# PSR-4 設定確認 (composer.json)
# "autoload": {
# "psr-4": {
# "App\\": "src/"
# }
# }
# 名前空間とディレクトリの対応確認
# App\Services\UserService → src/Services/UserService.php
7. Maximum execution time of N seconds exceeded
Fatal error: Maximum execution time of 30 seconds exceeded
in /var/www/index.php on line 50// php.ini
// max_execution_time = 60
// スクリプト内
set_time_limit(120); // 120 秒に延長
set_time_limit(0); // 無制限 (CLI 推奨)
// CLI なら -d で
// php -d max_execution_time=0 batch.php
8. Cannot redeclare function/class
Fatal error: Cannot redeclare function foo() (previously declared in /var/www/a.php:3)
in /var/www/b.php on line 3
原因: 同じ関数 / クラスを 2 回 require した。require_once / include_once を使うか、関数を function_exists() でガードします。
9. Trying to access array offset on null
// PHP 7.4 / 8.0+
Warning: Trying to access array offset on null
in /var/www/index.php on line 20// NG
$user = null;
echo $user['name']; // null は配列じゃない
// OK
echo $user['name'] ?? 'guest';
// OK (Null Safe Operator - PHP 8.0+)
echo $user?->name ?? 'guest';
php.ini の重要設定
; 開発環境
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php/error.log
; 本番環境
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
error_log = /var/log/php/error.log
; 共通
memory_limit = 256M
max_execution_time = 60
upload_max_filesize = 20M
post_max_size = 20M
エラー出力の制御
// 開発時: 全エラーを表示
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 本番: ログのみ
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/app.log');
// カスタムハンドラ
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
error_log("[$errno] $errstr at $errfile:$errline");
return true;
});
// 例外ハンドラ
set_exception_handler(function (Throwable $e) {
error_log($e->getMessage() . "\n" . $e->getTraceAsString());
http_response_code(500);
echo "Internal Server Error";
});
FAQ
Q: 画面が真っ白で何も表示されない
A: display_errors=Off で Fatal が出ているのに表示されない状態。エラーログ (/var/log/php/error.log や storage/logs/laravel.log) を確認してください。
Q: PHP 7 から 8 に上げたら大量の Warning が出る
A: Undefined variable などが Notice → Warning に昇格しました。?? '' / ?-> で防御的にコーディングし直してください。
Q: 本番でエラーがユーザに見えてしまった
A: display_errors=Off 必須。さらに Web サーバ (Nginx/Apache) 側でカスタムエラーページを設定してください。