No such file or directory は UNIX ソケットのファイルが見つからないエラー
PDO の __construct() で SQLSTATE[HY000] [2002] No such file or directory
エラーが出る事があります。
require_once
で変なディレクトリを指定しているわけでも、ライブラリが無いわけでもありません。
これは、 PHP が利用する UNIX ソケットのファイルが見つからないのが原因でした。
UNIX ソケットというのは、 PHP とMySQL を接続するためのものです。
修正方法
UNIX ソケットファイルの場所を確認
まずは UNIX ソケットファイルの場所を確認します。
$ mysqladmin version mysqladmin Ver 8.42 Distrib 5.6.39, for Linux on x86_64 Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 5.6.39 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 2 days 15 hours 19 min 58 sec Threads: 1 Questions: 46 Slow queries: 0 Opens: 67 Flush tables: 1 Open tables: 60 Queries per second avg: 0.000
/var/lib/mysql/mysql.sock
に UNIX ソケットのファイルがあることがわかります。
php.ini の設定を確認
続いて php.ini
を確認します。 php.ini
は PHP の設定ファイルです。
$ php -i | grep socket mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock sockets default_socket_timeout => 60 => 60
pdo_mysql.default_socket
が/tmp/mysql.sock
になっているので、これを先程の /var/lib/mysql/mysql.sock
に修正します。
php.ini の修正
php.ini
の場所を確認します。
$ php -i | grep php.ini Configuration File (php.ini) Path => /usr/local/lib Loaded Configuration File => /usr/local/lib/php.ini
僕の場合は /usr/local/lib/php.ini
に php.ini
が存在しています。これを編集します。
以下の設定を追記しました。
[PDO] pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
すでに mysql.default_socket
は設定してあったのですが、僕の場合は、 PDO の設定項目がありませんでした。
何も設定されていない場合のデフォルトは /tmp/mysql.sock
になるようです。
変更後
$ php -i | grep socket mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock pdo_mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock sockets default_socket_timeout => 60 => 60
これで接続できるようになりました。
参考ページ
PDOでPDO::__construct(): [2002] No such file or directory … エラー | Bamboo lath 日々の記録