PHPからMySQLサーバーに接続する関数がNo such file or directoryを返すときの対処法 [(全部俺)何でも Advent Calendar 2013 9日目]

この記事は「(全部俺)何でも Advent Calendar 2013」の9日目です。(1日遅れ

PHPとMySQLサーバーをどちらもディストリビューションのパッケージマネージャ(yum, apt等)でインストールしている場合にこの問題は起こりにくいとは思いますが、どちらかをソースコードからインストールするとmysql_connect(), mysqli_connect(), pdo_mysql_connect()でエラー “No such file or directory” となってしまいます。
この記事では3種類の解決法をご紹介しますが、他のサイトではこのうち1種類のみを紹介している場合がほとんどです。どの方法が適切かは状況によると思いますので、自己判断でお願いします。

解決法その1:ソケットへのシンボリックリンクを作ってごまかす

MySQLサーバーの起動時に作成されているソケット(CentOSならたぶん/var/lib/mysql/mysql.sock)へのシンボリックリンクを作って、PHPにはそこからMySQLにアクセスしてもらいましょう。
シンボリックリンクを作成する場所はphp -i | grep socket で確認してください。

解決法その2:PHPの設定を変更する

php.iniを変更して正しいソケットを参照できるようにしましょう。
設定項目は、mysql.default_socket, mysqli.default_socket, pdo_mysqli.default_socket等です。PHPのバージョンによっては他にもあるかもしれませんが、お使いのエディタでdefault_socketを検索して確認してください。
ソケットのパスはmysqlコマンドでMySQLサーバーに接続し、sを入力して表示されるステータスの「UNIX Socket」欄を確認してください。

解決法その3:MySQLサーバーの設定を変更する。

my.cnfを変更してPHPが使う場所にソケットを作成してあげましょう。
お使いのmy.cnfに以下の内容を記述してください。

[client]
socket=/path/to/socket
 
[server]
socket=/path/to/socket

localhostでの接続に問題が発生するので、必ず[client]セクションも記述します。
ソケットのパスはphp -i | grep socketで確認してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です