前提・実現したいこと
構築したローカルの Docker 開発環境にて
PHP の PDO を使って、ソケット経由で DB 接続テストをしたいです。
このために必要な処置につきまして、何卒ご教授ください。
※ 補足
後述の通り TCP 経由で接続テストはできておりますが
後学のために勉強させて頂きたく、質問をいたしました。
よろしくお願いいたします。
発生している問題・エラーメッセージ
// 下記の signup.php プログラムを chrome 上で実行した結果です SQLSTATE[HY000] [2002] Address not available
当エラーに関する情報は非常に多くありましたが
自力でこの問題を解決することができませんでした。
該当のソースコード
<PHP> signup.php ``` <?php// 簡素な入力フォームから POST データを取得して、DB 接続テストをしようとしています。
require_once('config/config.php');
try {
$pdo = new PDO(DSN, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
try {
$stmt = $pdo->prepare("insert into users(email, password) value(?, ?)");
$stmt->execute([$email, $password]);
echo '登録完了';
} catch (Exception $e) {
}
config/config.php
// 3306 か 3307 か自信がなかったため両方試しました(いずれもNG)。
<?php define('DSN', 'mysql:host=localhost:port=3306;dbname=cms001;'); define('DB_USER', 'hoge'); define('DB_PASS', 'hoge'); ``` Dockerfile ``` FROM php:8.0-fpm-alpine RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini COPY ./docker/php/php.ini /usr/local/etc/php/conf.d/php.ini RUN apk update --no-cache \ && apk add zip git autoconf libzip-dev libpng-dev libxpm-dev\ libjpeg-turbo-dev freetype-dev build-base mariadb-client \ unzip vim zlib oniguruma \ && docker-php-ext-configure zip \ --with-zip \ && docker-php-ext-configure gd \ --with-jpeg=/usr/include/ \ --with-freetype=/usr/include/ \ && docker-php-ext-install zip gd pdo_mysql mysqli \ && pecl install xdebug WORKDIR /var/www ``` docker-compose.yml ``` version: '3.8' services: web: container_name: nginx image: nginx:latest ports: - "8081:81" restart: always volumes: - "./docker/htdoc:/var/www" - "./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf" depends_on: - php-fpm db: container_name: mariadb image: mariadb:latest volumes: # データ永続化 - "./docker/mariadb/db/mariadb:/var/lib/mysql" # 設定ファイル - "./docker/mariadb/my.conf:/etc/mysql/conf.d/my.cnf:ro" ports: - "3307:3306" restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_PORT: 3306 MYSQL_USER: docker MYSQL_PASSWORD: docker php-fpm: container_name: php-fpm build: context: . volumes: - "./docker/htdoc:/var/www" - "./docker/php/php.ini:/etc/php/conf.d/php.ini" ports: - "3001:3001" restart: always depends_on: - db ``` php.ini (docker build 時に用いるファイル) ``` register_globals = off [Date] date.timezone = "Asia/Tokyo"; [mbstring] mbstring.internal_encording = "UTF-8"; mbstring.language = "Japanese"; [xdebug] xdebug.mode = debug xdebug.start_with_request = yes xdebug.client_host = "host.docker.internal" xdebug.client_port = 10903 xdebug.log = "/var/log/xdebug.log" [pdo] pdo_mysql.default_socket=/run/mysqld/mysqld.sock ``` ### 試したこと 1 ローカルのターミナルで mysql-client を使って tcp 経由で接続できます。 ``` // OK $ mysql -h localhost --port 3307 --protocol tcp -u root -p ``` 2 /run/mysqld/mysqld.sock について確認しました。 phpinfo では /run/mysqld/mysqld.sock を使う設定になっているようです。 ``` // phpinfo(); Directive Local Value Master Value pdo_mysql.default_socket /run/mysqld/mysqld.sock /run/mysqld/mysqld.sock ``` mariadb コンテナの docker desktop のログより mariadb が /run/mysqld/mysqld.sock を使う設定になっているようです。 ``` [Note] mysqld: ready for connections. Version: '10.6.4-MariaDB-1:10.6.4+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution ``` mariadb コンテナの CLI にて当該 socket が存在して、mysql からアクセスできる権限になっていることを確認しました。 ``` $ ls -al mysqld.sock srwxrwxrwx 1 mysql mysql 0 Nov 10 13:03 mysqld.sock $ pwd /var/run/mysqld ``` 3 回答にてご指摘いただいた内容を確認しました。 config.php の DNS の host を db に試したところ繋がらず、エラー内容が変わりました。 (localhost 以外に 127.0.0.1 を試しましたが同様の結果になりました。) ``` // SQLSTATE[HY000] [2002] Connection refused <?php define('DSN', 'mysql:host=db:port=3306;dbname=cms001;'); define('DB_USER', 'hoge'); define('DB_PASS', 'hoge'); ``` ### 解決 ・config/config.php の修正によって解決 ``` // 修正前 // define('DSN', 'mysql:host=127.0.0.1:port=3306;dbname=cms001;'); // 修正後 define('DSN', 'mysql:host=db;port=3306;dbname=cms001;'); ```回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/11 10:18 編集
2021/11/12 01:10
退会済みユーザー
2021/11/13 10:45
2021/11/13 11:23
退会済みユーザー
2021/11/21 07:00