PHPのyumインストールで依存関係エラー? remiリポジトリ起因のphp-pdo競合を解決

こんにちは!インターライフメディアです。
CentOS 7環境でWebサイトを構築・運用していると、PHPの拡張機能を追加インストールする場面があります。しかし、yumコマンドでphp-mysqlphp-pgsqlなどをインストールしようとした際、予期せぬエラーに遭遇することがあります。

今回は、特に「remi」リポジトリを利用してPHP 7.1などを導入している環境で起こりがちな、php-pdoの依存関係エラーと、そのスマートな解決方法について解説します。

⚠️ 遭遇したエラー:php-pdoのバージョン競合

yum install php-mysqlのようなコマンドを実行したところ、以下のようなエラーメッセージが表示されました。

エラー: パッケージ: php-mysql-5.4.16-48.el7.x86_64 (base)
             要求: php-pdo(x86-64) = 5.4.16-48.el7
            インストール: php-pdo-7.1.33-27.el7.remi.x86_64 (@remi-php71)
                php-pdo(x86-64) = 7.1.33-27.el7.remi
            利用可能: php-pdo-5.4.16-48.el7.x86_64 (base)
                php-pdo(x86-64) = 5.4.16-48.el7
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

このエラーメッセージを読み解くと、以下の状況がわかります。

  • インストールしようとしている php-mysql は、OS標準(base)のPHP 5.4.16 版です。
  • このPHP 5.4版 php-mysql は、当然ながらPHP 5.4.16 版の php-pdo を要求します(「要求: php-pdo(x86-64) = 5.4.16-48.el7」)。
  • しかし、システムには既に remi-php71 リポジトリからインストールされたPHP 7.1.33 版の php-pdo が存在します(「インストール: php-pdo-7.1.33…」)。

つまり、「インストールしたい5.4系のパッケージ」と「既にインストールされている7.1系のパッケージ」とで、依存関係(php-pdo)のバージョンが衝突(コンフリクト)してしまっているのです。

念のため、現在のPHPのバージョンを確認してみましょう。

# php -v
PHP 7.1.33 (cli) (built: Aug  1 2023 16:14:19) ( NTS )

やはり、システムでアクティブなのはPHP 7.1系ですね。それなのに、yumが標準のPHP 5.4系パッケージをインストールしようとしたことが、エラーの原因でした。

💡 解決策:remi-php71リポジトリを明示的に指定する

この問題を解決するには、yumコマンドを実行する際に、「今使っているPHP 7.1用のリポジトリ(remi-php71)からパッケージを探してインストールしてね」と明示的に指示してあげる必要があります。

具体的には、--enablerepo=remi-php71 オプションを使用します。

# PostgreSQL用
yum --enablerepo=remi-php71 install -y php-pgsql

# MySQL用
yum --enablerepo=remi-php71 install -y php-mysql

(※注:PHP 7系では、php-mysql パッケージは非推奨となり、実際には php-mysqlnd (MySQL Native Driver) が推奨・使用されます。上記のコマンドを実行すると、多くの場合 php-mysqlnd が依存関係として自動的にインストールされます。)

パッケージのインストールが完了したら、Webサーバー(ApacheやNginx)が新しいPHP拡張機能を認識できるように、忘れずにサービスを再起動しましょう。

# Apacheの場合
systemctl restart httpd

# Nginx + php-fpm の場合
systemctl restart php-fpm

インストールの確認

最後に、パッケージが正しくインストールされたかを確認します。

# yumでインストールされたパッケージ一覧から確認
yum list installed | grep php

# PHPモジュールとして読み込まれているか確認 (MySQLの例)
php -m | grep mysql

yum list installed の結果で php-pgsql.x86_64 7.1.33... @remi-php71 のように、@remi-php71 からインストールされたことが確認できれば成功です。また、php -mmysqlndpdo_mysql などが表示されれば、モジュールとしても認識されています。

📋 まとめ

CentOS 7で複数のリポジトリ(特にOS標準とremiなど)を併用している環境では、PHPパッケージの依存関係でコンフリクトが発生することがあります。エラーメッセージをよく読み、「どのリポジトリの」「どのバージョンの」パッケージが問題を起こしているのかを特定することが重要です。

多くの場合、--enablerepo オプションで適切なリポジトリを指定することで、依存関係の問題をクリアし、目的のパッケージをスムーズにインストールできます。

よくある質問 (FAQ)

Q1. 「remi」リポジトリとは何ですか?

A1. remiリポジトリは、CentOSやRHEL(Red Hat Enterprise Linux)などのディストリビューション向けに、最新バージョンのPHPや関連パッケージを提供するサードパーティ(第三者)リポジトリです。OS標準のリポジトリ(base)に含まれるPHPはバージョンが古いことが多いため、remiリポジトリを利用して新しいPHPをインストールするのが一般的です。

Q2. エラーに出てきた --skip-broken オプションは使っても良いですか?

A2. --skip-broken は、依存関係の問題があるパッケージを「スキップ(無視)」して、インストールできるものだけをインストールするオプションです。今回のケースでこれを使用すると、肝心の php-mysql がインストールされない可能性が高いです。根本的な解決(適切なリポジトリの指定)ではないため、今回のようなバージョン競合の解決には推奨されません。

Q3. php-mysqlphp-mysqlnd は何が違うのですか?

A3. php-mysql は、PHPがMySQLデータベースと通信するための古い拡張機能で、MySQLクライアントライブラリ(libmysqlclient)に依存していました。一方、php-mysqlnd (MySQL Native Driver) は、PHPのソースコードに統合された新しいドライバで、外部ライブラリに依存しません。PHP 5.4以降は php-mysqlnd が推奨されており、パフォーマンスや機能面でも優れています。PHP 7系では、php-mysql をインストールしようとしても、実体として php-mysqlnd が使われる(または依存関係でインストールされる)のが標準です。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら