概要
Docker Composeで作成したnginx + PHP-FPM + MySQLの環境でPDOを使ったコードを実行するとcould not found driver
エラーが発生しました。
解決したのでメモです。
目次
参考サイト様
- How do you get php-mysql extensions installed for php:7-fpm-alpine · Issue #279 · docker-library/php 🔗
- 【Docker】phpでPDOにmysqlを使うと、could not find driverと出る【186日目】 - エンジニアのひよこ_level10 🔗
ソース
https://github.com/Lycheejam/php-crud-sample 🔗
事象
下記のソースコードでPHPを実行するとcould not found driver
エラーがブラウザに表示される。
コード
DBからデータ取得して表示するためのサンプルコードです。
<?php
$dsn = 'mysql:host=db;dbname=SAMPLEDB;charset=utf8mb4';
$username = 'sampleuser';
$password = 'password';
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
);
try {
$pdo = new PDO($dsn, $username, $password, $options);
$result = $pdo->query('select * from SAMPLETBL');
foreach($result as $row) {
echo "No.{$row['ID']}<br>";
echo "NAME : {$row['NAME']}<br>";
echo "AGE : {$row['AGE']}<br>";
echo '<br>';
}
} catch (PDOException $e) {
exit($e->getMessage());
}
?>
エラー画面
原因
PDOのMySQL用ドライバがPHP-FPMサーバにインストールされていなかったため。
ドライバが未インストールであることを確認
$ docker-compose exec php bash
root@71d6f27992e6:/var/www/html# php -m | grep pdo
pdo_sqlite
phpomfo()
から確認
対策
PDOのMySQL用ドライバをPHP-FPMサーバにインストールする。
パッケージの確認
yum
がコンテナにインストールされてないのでpecl
で確認した。
$ docker-compose exec php bash
root@71d6f27992e6:/var/www/html# pecl search pdo_mysql
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest) Local
PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO
Dockerfile
の編集
コメント部分にインストールコマンドを追記
※pecl
だとエラーとなったためdocker-php-ext-install
を使う。
リポジトリにあるっぽいのになんでだ…
Dockerfile
FROM php:7-fpm
RUN pecl install xdebug && \
docker-php-ext-enable xdebug && \
#下記を追記
docker-php-ext-install pdo_mysql
編集後、docker-compose build
でリビルドする。
ドライバがインストールされたことを確認
$ docker-compose exec php bash
root@077aa23fd33c:/var/www/html# php -m | grep pdo
pdo_mysql
pdo_sqlite
phpinfo()
から確認
コードが動作していることを確認
雑感
PDO使うのにドライバが必要だなんて聞いてないよ〜と言う感じである。