9.

composer install「PHP extension dom is missing」の原因と OS 別インストール手順

編集
この記事の要点
  • composer install / update 実行時に出る PHP 拡張不足エラー
  • 不足しやすい拡張: dom / xml / mbstring / zip / curl / gd / intl
  • Ubuntu/Debian: sudo apt install php-xml php-mbstring php-zip(dom は php-xml に含まれる)
  • CentOS/RHEL: sudo yum install php-xml php-mbstring
  • Docker: RUN docker-php-ext-install dom xml mbstring zip を Dockerfile に追加
  • 確認: php -m | grep dom で有効化済か確認、php --ini で php.ini の場所を特定

このエラーの概要

Laravel / Symfony プロジェクトで composer installcomposer update を実行したときに、次のようなメッセージが出て止まります:

Problem 1
  - laravel/framework[v10.0.0, ..., v10.48.0] require ext-dom * -> it is missing
    from your system. Install or enable PHP's dom extension.
  - Root composer.json requires laravel/framework ^10.0 -> satisfiable by
    laravel/framework[v10.0.0, ...].

To enable extensions, verify that they are enabled in your .ini files:
    - /etc/php/8.2/cli/php.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

これは Composer が依存パッケージの require セクションで指定された PHP 拡張(ext-dom 等)が、現在の PHP に組み込まれていないことを検知したときに出るエラーです。

不足しがちな PHP 拡張一覧

拡張名用途Ubuntu パッケージCentOS パッケージ
domXML/HTML パース(DOMDocument)php-xmlphp-xml
xmlXML 全般php-xmlphp-xml
mbstringマルチバイト文字列php-mbstringphp-mbstring
zipZip 圧縮・展開php-zipphp-pecl-zip
curlHTTP クライアントphp-curlphp-curl
gd画像処理php-gdphp-gd
intl国際化・ロケールphp-intlphp-intl
bcmath任意精度演算php-bcmathphp-bcmath
pdo_mysqlMySQL 接続php-mysqlphp-mysqlnd

対処1: Ubuntu / Debian の場合

# 現在の PHP バージョンを確認
php -v
# PHP 8.2.x のように表示される

# dom / xml / mbstring / zip をまとめて入れる
sudo apt update
sudo apt install php-xml php-mbstring php-zip php-curl php-gd

# 特定バージョン指定(PHP 8.2 を使っているとき)
sudo apt install php8.2-xml php8.2-mbstring php8.2-zip

# 確認
php -m | grep -E "dom|xml|mbstring|zip"

# Apache を使っている場合は再起動
sudo systemctl restart apache2
# Nginx + PHP-FPM の場合
sudo systemctl restart php8.2-fpm

対処2: CentOS / RHEL / AlmaLinux の場合

# Remi リポジトリ利用が一般的
sudo yum install php-xml php-mbstring php-pecl-zip php-curl

# モジュール指定(PHP 8.2)
sudo dnf module reset php
sudo dnf module install php:remi-8.2
sudo dnf install php-xml php-mbstring php-pecl-zip

# 確認
php -m | grep dom

# php-fpm 再起動
sudo systemctl restart php-fpm

対処3: macOS (Homebrew) の場合

# Homebrew の PHP は dom / xml / mbstring が同梱
brew install php@8.2

# 切り替え
brew unlink php && brew link php@8.2 --force

# 確認
php -m | grep -E "dom|xml|mbstring"

対処4: Docker / Dockerfile の場合

公式 php:8.2-fpm 等のイメージは最小構成のため、多くの拡張が入っていません。Dockerfile で明示的にインストールします:

FROM php:8.2-fpm

# 必要な OS パッケージ
RUN apt-get update && apt-get install -y \
    libxml2-dev \
    libzip-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libicu-dev \
    libonig-dev \
    zip \
    unzip \
    git \
    && rm -rf /var/lib/apt/lists/*

# PHP 拡張をインストール
RUN docker-php-ext-install \
    dom \
    xml \
    mbstring \
    zip \
    pdo_mysql \
    bcmath \
    intl

# GD は configure が必要
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd

# Composer インストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

対処5: php.ini で明示的に有効化

パッケージはインストール済だが php.ini で有効化されていない場合もあります:

# php.ini の場所を確認
php --ini
# Loaded Configuration File: /etc/php/8.2/cli/php.ini
# Additional .ini files parsed:
#   /etc/php/8.2/cli/conf.d/20-dom.ini
#   /etc/php/8.2/cli/conf.d/20-xml.ini

# 拡張ディレクトリ確認
php -i | grep extension_dir
# extension_dir => /usr/lib/php/20220829

# 手動で有効化(自動で読み込まれない場合)
echo "extension=dom" | sudo tee -a /etc/php/8.2/cli/php.ini
echo "extension=xml" | sudo tee -a /etc/php/8.2/cli/php.ini

# CLI と Apache/FPM では別々の php.ini を持つので注意
sudo cp /etc/php/8.2/cli/conf.d/20-dom.ini /etc/php/8.2/fpm/conf.d/

対処6: 一時回避(非推奨)

テスト環境で拡張をすぐ入れられない場合、composer に拡張チェックをスキップさせる方法があります(本番では絶対に使わない):

# 拡張要件をスキップ
composer install --ignore-platform-req=ext-dom

# 複数指定
composer install \
  --ignore-platform-req=ext-dom \
  --ignore-platform-req=ext-xml \
  --ignore-platform-req=ext-mbstring

# 全プラットフォーム要件を無視(本当に最後の手段)
composer install --ignore-platform-reqs

確認方法

# インストール済拡張一覧
php -m

# 特定の拡張だけ確認
php -r "echo extension_loaded('dom') ? 'OK' : 'NG';"

# Composer 側から見たプラットフォーム
composer show --platform

# Composer が認識する PHP / 拡張
composer check-platform-reqs

よくあるトラブル

症状原因対処
apt install 後も「missing」CLI と Web で異なる php.iniFPM 側にも 20-dom.ini をコピー、FPM 再起動
複数 PHP バージョンが混在/usr/bin/php/opt/...which -a php で全候補、update-alternatives
Docker でビルドは通るが実行で失敗マルチステージで拡張未コピー最終ステージにも docker-php-ext-install
php-xml 入れても dom 出ないphp-fpm 再起動忘れsystemctl restart php-fpm

FAQ

Q: domxml の違いは?
A: dom は DOMDocument 系 API(HTML/XML パース)、xml は SimpleXML / XMLReader 系。Laravel は両方必要です。

Q: php.ini を編集したのに反映されない
A: CLI で確認したい場合は CLI の php.ini、Web (Apache/Nginx+FPM) の場合は SAPI 側の php.ini を編集する必要があります。phpinfo() で「Loaded Configuration File」を確認してください。

Q: Docker で docker-php-ext-install dom が遅い
A: 複数拡張を 1 行にまとめると共有部分のビルドが省略され速くなります。また mlocati/docker-php-extension-installer を使うと依存解決も自動になります。

関連エラー

  • Class 'DOMDocument' not found — 同じく ext-dom 未インストール
  • ext-mbstring * is missingphp-mbstring をインストール
  • ext-zip * is missingphp-zip(CentOS は php-pecl-zip
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Fatal error: Maximum execution time of 30 seconds exceeded in...
  2. Fatal error: Uncaught Error: Cannot use object of type stdClass as array in ...
  3. Warning: Use of undefined constant ... - assumed '...' (this will throw an Error)
  4. ERROR: Call to undefined method Maatwebsite\Excel\Excel::load()
  5. Maximum execution time of 30 seconds exceeded
  6. Your requirements could not be resolved to an installable set of packages. ... To enable extensions, verify that they are enabled in your .ini files:
  7. could not find driver
  8. the requested PHP extension mbstring is missing from your system.
  9. the requested PHP extension dom is missing from your system.
  10. A non well formed numeric value encountered
  11. Warning: Cannot modify header information - headers already sent by ...
  12. php_network_getaddresses: getaddrinfo failed: Name or service not known
  13. XMLWriter::openUri(): Unable to resolve file path
  14. Object of class stdClass could not be converted to string
  15. Class 'Google_Service_Youtube' not found