WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

PDOのconstructでSQLSTATE[HY000] [2002] No such file or directoryが出る場合

もくじ

PDOの__construct()でNo such file or directoryが出るけど原因がよくわからん場合

PDOの__construct()でNo such file or directoryが出る事があります。require_onceとかで変なディレクトリを指定しているわけでもないし、ライブラリが入ってないとかでもない...一体何なんだろう。と思っていたら、PHPが利用するUNIXソケットのファイルが見つからないというのが原因でした。

修正方法

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.sockUNIXソケットのファイルとのことです。

php.iniの設定を確認

続いてphp.iniの設定を確認します。

$ 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になっているのでこれを修正します。

修正方法

まずは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 日々の記録