インフラ・運用 2026.02.07

Laravel「Class DOMDocument not found」エラーの完全解決ガイド

約12分で読めます

Laravelアプリケーションで「Class DOMDocument not found」エラーが発生する原因と、具体的な解決手順を実案件の経験をもとに詳しく解説します。

Laravel開発でこんなトラブルに遭遇していませんか?

Laravelアプリケーションでキャッシュクリアを実行した際、突然「Class DOMDocument not found」というエラーメッセージが表示され、アプリケーションが正常に動作しなくなってしまった経験はありませんか?

実際に当社でも、クライアントの本番環境で同様のトラブルが発生し、急遽対応が必要になったケースがありました。エラーログを確認すると、Termwindライブラリ内でDOMDocumentクラスが見つからないという問題が発生していました。

このエラーは一見すると複雑に見えますが、実はPHPの拡張モジュール不足が原因であることがほとんどです。本記事では、20年以上のWeb制作実績を持つ当社が、実際の対応経験をもとに根本的な解決方法をご紹介します。

エラーの概要:何が起きているのか?

エラーの発生メカニズム

提供いただいたエラーログを分析すると、以下の流れでエラーが発生していることが分かります:

  1. Laravelのキャッシュクリア処理cache:clearコマンド)が実行される
  2. Termwindライブラリがコンソール出力の整形を行う
  3. HtmlRendererクラスがHTML解析のためDOMDocumentクラスを呼び出す
  4. DOMDocumentクラスが見つからないためエラーが発生

影響範囲の特定

このエラーが発生すると、以下の機能に影響が出る可能性があります:

  • Artisanコマンドの実行(特にキャッシュ関連)
  • コンソールコマンドの出力表示
  • Webアプリケーション内でのプログラマティックなキャッシュクリア
  • デプロイメント処理の自動化

実際のクライアント事例では、管理画面からのキャッシュクリア機能が使えなくなり、サイトの更新作業に支障をきたしていました。

原因の特定方法

1. エラーログの詳細分析

まず、エラーログの重要な部分を確認しましょう:

ERROR: Class "DOMDocument" not found at /var/www/vhosts/fivenine-design.com/httpdocs/vendor/nunomaduro/termwind/src/HtmlRenderer.php:32

このエラーメッセージから、以下のことが分かります:

  • エラー箇所:Termwind(Laravelのコンソール出力ライブラリ)内
  • 原因クラスDOMDocumentクラスが存在しない
  • 発生タイミング:HTMLレンダリング処理時

2. PHP拡張モジュールの確認方法

現在のPHP環境で利用可能な拡張モジュールを確認します:

# 全ての拡張モジュールを確認
php -m

# DOM拡張が有効か具体的に確認
php -m | grep -i dom

# より詳細な情報を確認
php --version
php --ini

3. コードレベルでの確認

PHPスクリプトで直接確認する方法:

<?php
// DOMDocument クラスが利用可能かチェック
if (class_exists('DOMDocument')) {
    echo "DOMDocument is available\n";
} else {
    echo "DOMDocument is NOT available\n";
}

// DOM拡張の詳細情報を確認
if (extension_loaded('dom')) {
    echo "DOM extension is loaded\n";
    echo "DOM extension version: " . phpversion('dom') . "\n";
} else {
    echo "DOM extension is NOT loaded\n";
}
?>

解決手順:具体的なコマンドと設定変更

ステップ1:サーバー環境の確認

まず、現在のサーバー環境を正確に把握します:

# PHP バージョンの確認
php --version

# OS の確認
cat /etc/os-release

# パッケージマネージャーの確認(CentOS/RHEL の場合)
yum --version

# または Ubuntu/Debian の場合
apt --version

ステップ2:DOM拡張モジュールのインストール

CentOS/RHEL/AlmaLinux の場合:

# PHP のバージョンに応じた DOM 拡張をインストール
# PHP 8.1 の場合
sudo yum install php81-php-xml php81-php-dom

# PHP 8.2 の場合
sudo yum install php82-php-xml php82-php-dom

# または、一般的なパッケージ名で
sudo yum install php-xml php-dom

Ubuntu/Debian の場合:

# DOM 拡張を含む XML パッケージをインストール
sudo apt update
sudo apt install php-xml php-dom

# 特定のPHPバージョンの場合(例:PHP 8.1)
sudo apt install php8.1-xml php8.1-dom

Plesk環境の場合:

  1. Pleskコントロールパネルにログイン
  2. 「ツールと設定」→「PHP設定」を選択
  3. 対象のPHPバージョンを選択
  4. 「PHP拡張」タブで「dom」拡張を有効化
  5. 設定を保存

ステップ3:Webサーバーの再起動

拡張モジュールをインストール後、Webサーバーを再起動します:

# Apache の場合
sudo systemctl restart httpd
# または
sudo systemctl restart apache2

# Nginx + PHP-FPM の場合
sudo systemctl restart nginx
sudo systemctl restart php-fpm

# Plesk の場合
sudo service sw-engine restart

ステップ4:インストールの確認

拡張モジュールが正しくインストールされたかを確認:

# DOM拡張が有効になったかチェック
php -m | grep -i dom

# 出力例:
# dom

ステップ5:Laravel アプリケーションのテスト

最後に、元々エラーが発生していたコマンドを実行してテストします:

# Laravel プロジェクトのディレクトリに移動
cd /path/to/your/laravel/project

# キャッシュクリアコマンドを実行
php artisan cache:clear

# 成功した場合の出力例:
# Application cache cleared successfully.
エラー解決後のコマンド実行時間の改善
出典: Fivenine Design実測データ

よくある失敗パターンと対処法

失敗パターン1:間違ったPHPバージョンに拡張をインストール

症状

php -m | grep dom
# 何も表示されない、または古いバージョンの情報のみ

原因: 複数のPHPバージョンがインストールされている環境で、Webサーバーが使用するPHPバージョンと異なるバージョンに拡張をインストールしてしまった。

対処法

# Webサーバーが使用しているPHPバージョンを確認
php -v

# phpinfoで詳細確認(Web経由)
echo "<?php phpinfo(); ?>" > /tmp/info.php
php /tmp/info.php | grep "PHP Version"

# 正しいバージョンに拡張をインストール
sudo yum install php81-php-xml  # 例:PHP 8.1の場合

失敗パターン2:権限不足でインストールが失敗

症状

Permission denied
Package installation failed

対処法

# sudoを使用してroot権限で実行
sudo yum install php-xml

# または、ユーザーをsudoグループに追加(要注意)
sudo usermod -aG sudo username

失敗パターン3:Composerキャッシュの影響

実際のクライアント事例で遭遇したのが、DOM拡張をインストール後もエラーが継続するケースでした。これはComposerのキャッシュが影響していました。

対処法

# Composer キャッシュをクリア
composer clear-cache

# vendor ディレクトリを再構築
rm -rf vendor/
composer install --no-dev --optimize-autoloader

# Laravel のキャッシュもクリア
php artisan cache:clear
php artisan config:clear
php artisan view:clear

失敗パターン4:共有サーバーでの制限

症状: 共有レンタルサーバーでPHP拡張を追加できない。

対処法

  1. サーバー管理者に連絡してDOM拡張の有効化を依頼
  2. VPSやクラウドサーバーへの移行を検討
  3. Termwindを使わない設定に変更
// config/app.php で Termwind を無効化する設定例
'providers' => [
    // Termwind関連のサービスプロバイダーをコメントアウト
    // NunoMaduro\Termwind\Laravel\TermwindServiceProvider::class,
],

再発防止策

1. サーバー環境のドキュメント化

今回のような問題を防ぐため、サーバー環境の情報を文書化することが重要です:

#!/bin/bash
# server-info.sh - サーバー環境情報収集スクリプト

echo "=== Server Environment Information ==="
echo "Date: $(date)"
echo "OS: $(cat /etc/os-release | grep PRETTY_NAME)"
echo "PHP Version: $(php --version | head -n 1)"
echo "Installed PHP Extensions:"
php -m | sort
echo ""
echo "=== Laravel Information ==="
echo "Laravel Version: $(php artisan --version)"
echo "Environment: $(php artisan env)"

2. デプロイメント時の自動チェック

#!/bin/bash
# deploy-check.sh - デプロイ前の環境チェックスクリプト

# 必要な PHP 拡張がインストールされているかチェック
REQUIRED_EXTENSIONS=("dom" "xml" "mbstring" "openssl" "pdo" "tokenizer")

for ext in "${REQUIRED_EXTENSIONS[@]}"; do
    if php -m | grep -q "$ext"; then
        echo "✓ $ext extension is installed"
    else
        echo "✗ $ext extension is missing"
        exit 1
    fi
done

echo "All required extensions are installed."

3. 監視とアラートの設定

// app/Console/Commands/HealthCheck.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HealthCheck extends Command
{
    protected $signature = 'health:check';
    protected $description = 'Check system health including required PHP extensions';

    public function handle()
    {
        $requiredExtensions = ['dom', 'xml', 'mbstring', 'openssl'];
        $missingExtensions = [];

        foreach ($requiredExtensions as $extension) {
            if (!extension_loaded($extension)) {
                $missingExtensions[] = $extension;
            }
        }

        if (!empty($missingExtensions)) {
            $this->error('Missing PHP extensions: ' . implode(', ', $missingExtensions));
            return 1;
        }

        $this->info('All required PHP extensions are loaded.');
        return 0;
    }
}

4. Docker環境での対応

Docker環境を使用している場合の予防策:

# Dockerfile の例
FROM php:8.1-fpm

# 必要な拡張モジュールをインストール
RUN apt-get update && apt-get install -y \
    libxml2-dev \
    && docker-php-ext-install \
    dom \
    xml \
    pdo \
    pdo_mysql

# Laravel の依存関係をインストール
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

解決できない場合は

エラーが解決しない場合、無料でご相談ください

詳しく見る

まとめと次のステップ

「Class DOMDocument not found」エラーは、PHP環境でDOM拡張モジュールが不足していることが原因です。適切な拡張モジュールをインストールし、Webサーバーを再起動することで解決できます。

重要なポイント:

  • 根本原因:PHP DOM拡張モジュールの不足
  • 解決方法:適切なPHPバージョンにDOM拡張をインストール
  • 確認方法php -m | grep dom でインストール状況を確認
  • 予防策:環境のドキュメント化と定期的なヘルスチェック

実際の運用では、このようなエラーが発生する前に定期的な環境チェックを実施することが重要です。当社では、クライアントのサーバー環境を定期的に監視し、必要に応じてプロアクティブに対応することで、サービスの安定性を保っています。

次のアクション:

  1. 即座に対応が必要な場合は、上記の解決手順を順番に実行
  2. 根本的な改善を図りたい場合は、サーバー環境の見直しを検討
  3. 技術的なサポートが必要な場合は、専門家にご相談ください

当社では、Laravel開発から運用まで一貫したサポートを提供しています。サーバー環境の最適化や安定運用について、お困りのことがございましたらお気軽にお問い合わせください。

この記事をシェア

この記事の内容でお困りですか?

無料でご相談いただけます

Webサイトの改善、システム開発、AI導入など、 お気軽にご相談ください。初回相談は無料です。

無料相談してみる
AIに無料相談