こんにちは!インターライフメディアです。
CentOS 7環境でWebサイトを構築・運用していると、PHPの拡張機能を追加インストールする場面があります。しかし、yumコマンドでphp-mysqlやphp-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 -m で mysqlnd や pdo_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-mysql と php-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 が使われる(または依存関係でインストールされる)のが標準です。