猫でもわかるWebプログラミングと副業

本業Webエンジニア。副業でもWebエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

【PHP】 PDO の construct で SQLSTATE[HY000] [2002] No such file or directory

f:id:yoshiki_utakata:20210510220646p:plain

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.iniphp.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 日々の記録