PHP
WordPress
Mac

PHPビルトインサーバでWordpressを動かす際にHomebrewでMySQLだと動かない問題

More than 3 years have passed since last update.

MacでWordpressを動かそうとしたらMAMPを入れると簡単にできるというが、それなりにWordpressを動かすまで設定するのは面倒臭い

そこでPHP5.4からサポートしたPHPビルトインサーバの登場だ

こんな感じで、ホスト名とポートを指定してやればローカルサーバ立ち上がり、PHPが実行可能になりブラウザから動作を確認することが出来て超便利

php -S localhost:8000

さてこの超便利なビルトインサーバなんですが、Wordpressをローカルで立ち上げるようなMySQLに接続することをやらせようとすると、どうもDB接続エラーが出る。

MySQLに接続するDB名や、ユーザ名、パスワードはあっているのに、接続エラー出てしまう

簡単なDB接続するPHPのコードでもエラーが発生してしまう。

原因を調査すると、MySQLをHomebrewでインストールしている場合、このような現象が発生していることがわかった。


PHPのMySQL接続用のソケットを確認する


現在動いているMySQLの接続用のソケットを格納する

# MySQLソケットプロセスの場所を確認

> mysql_config --socket
/tmp/mysql.sock

/tmp.sysql.sock で実行している


PHPの接続しているMySQLソケットプロセスの場所を確認

PHPはMySQLの接続ライブラリを組み込みで持っていて、少なくとも素のWordPressではこいつを利用してDB接続しているようだ

PHPが接続詞しに行くMySQLソケットプロセスの場所を確認する

> php -i | grep socket

mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
mysqli.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
pdo_mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock

とこのように、見に行くソケットが違うためPHPがMySQLに接続できないことがわかる


  • /tmp/mysql.sock

  • /var/mysql/mysql.sock


PHPのMySQL接続ソケットの場所を変更する


PHPの設定ファイルの位置を確認する

以下のファイルを作成してビルトインサーバを起動する


info.php

<?php

phpinfo();
?>

> php -S localhost:8000

ブラウザでlocalhost:8000/info.phpにアクセスし、

Loaded Configuration Fileの項を確認する

オレの場合は空だったので、デフォルト値を見ていることになるだろう。


PHP設定ファイルの作成

/etcディレクトリにはphp.ini.defaultと言うファイルがあり、デフォルト設定があるのでとりあえずこれをコピーし、必要部分書き換える

sudo cp /etc/php.ini.default /etc/php.ini

sudo emacs /etc/php.ini

以下の設定箇所の=の右側にHomebrewで入れたMySQLが作るソケットプロセスのパス'/tmp/mysql.sock'を入れてやる

mysql.default_socket = '/tmp/mysql.sock'

mysqli.default_socket = '/tmp/mysql.sock'
pdo_mysql.default_socket = '/tmp/mysql.sock'

もう一度PHPのMySQL接続するソケットプロセスの場所を確認すると、変更されていることがわかる

> php -i | grep socket

mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
mysqli.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

あとはビルトインサーバでもWordpressが動くぜ。これでも動かなかったらMysqlの設定か、DB接続情報が間違っているはず