もくじ
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.sock
がUNIXソケットのファイルとのことです。
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 日々の記録