MAMPでDrushを使うと「In Connection.php line 189: SQLSTATE[HY000] [2002] No such file or directory」が表示される場合の対処法

モチヤスタッフ

MAMPでローカル開発環境を構築したDrupalの環境に、ComposerでDrushをインストールした場合、そのままではMySQLの接続エラーが出てしまいます。

正確にはDrushのインストールまでは問題なくできるのですが、いざデータベースの接続や操作が必要なdrushコマンドを実行するとエラーが表示されます。

今回はこのエラーの解消法や、なぜこのエラーが発生するのか深掘りをします。
MAMP環境でDrushをインストールしたい方や、インストールしようとして断念した方はぜひ最後までご覧ください。

前提

まず前提として、MAMPでローカル開発環境の構築をしていて、Drushをインストールする必要があります。

それぞれ方法は過去に記事にしているので、参考にしながら開発環境を構築してください。

  1. MAMPを使ったDrupalのローカル開発環境の構築方法
  2. ターミナルからDrupalを操作する「Drush」コマンドのインストール方法や基本的な使い方

実際に表示されるエラー内容

例えばDrushがインストールされたMAMP環境下で、Drupalのフロントページを表示する「drush browse」コマンドを実行すると下記のエラーが表示されました。
 

「drush browse」コマンドを実行した際のターミナル画面

In Connection.php line 189: SQLSTATE[HY000] [2002] No such file or directory

エラーメッセージを直訳すると下記の通りです。

「Connection.php」ファイルの189行目のエラー: SQLSTATE[HY000] [2002] 対象のファイルは見つかりません

このエラーは「mysql.sock」ファイルが存在しないことで、データベースに接続できない場合に表示されるエラーです。
念のため実際にエラーが出ているファイルの「Connection.php」を開いてみます。

「core/modules/mysql/src/Driver/Database/mysql/Connection.php」を開くと、ちょうど189行目にPDOを使ってデータベースに接続しようとしているコードがあります。

Connection.phpの展開画面
 

ここでエラーが表示されているので、やはりデータベースの接続関連のエラーだと分かります。

解決方法

このエラーを解決するためには「sites/defaualt/settings.php」にある「$databases['default']['default']」を修正します。

$databases['default']['default'] = array (
  'database' => 'drupal_9',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\mysql\\Driver\\Database\\mysql',
  'driver' => 'mysql',
  'autoload' => 'core/modules/mysql/src/Driver/Database/mysql/',
);

ここで「host」の「localhost」を「127.0.0.1」にするのと、最後に「'unix_socket'」を追加します。

「'unix_socket'」にはMAMPの「mysql.sock」ファイルがあるパスを指定しますが、特になにもいじっていなければ「/Applications/MAMP/tmp/mysql/mysql.sock」にあるはずです(MAMPを起動して「Start」していないと表示されません)。
 

フォルダ内のmysql.sock位置説明

下記のようにコードを修正すれば完了です。

hostの修正イメージ

$databases['default']['default'] = array (
  'database' => 'drupal_9',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => '127.0.0.1',
  'port' => '3306',
  'namespace' => 'Drupal\\mysql\\Driver\\Database\\mysql',
  'driver' => 'mysql',
  'autoload' => 'core/modules/mysql/src/Driver/Database/mysql/',
  'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
);

 

保存して再度コマンドを実行すると、エラーが表示されずに無事動作しました。
もしまだ同じエラーが表示される場合は、再度修正内容を見直すのと、MAMPが起動していて「Start」の状態になっているか確認してください。

drush browseでwarningが表示される場合

もし、drush browseを実行したときに今度は別の下記エラーが出てきた場合は、DrupalのURLがうまく認識されていない可能性があります。

warningのエラー表示

[warning]default does not appear to be a resolvable hostname or IP, not starting browser. You may need to use the --uri option in your command or site alias to indicate the correct URL of this site.

[警告]「http://default/」は解決可能なホスト名またはIPではないようで、ブラウザを起動していません。--uriオプションを使用して、このサイトの正しいURLを指定する必要があります。
 

この場合は「vendor/drush/drush/drush.yml」ファイルを開いて、下記コードを追加します。

options:
  uri: 'フロントページのURL'

drush.ymlファイルへの追記イメージ

これで保存して再度drush browseを実行すると、今度はきちんとDrushのフロントページが開くようになっているはずです。

発生する原因

「sites/defaualt/settings.php」にある「$databases['default']['default']」ではデータベースへの接続情報が入っています。
入力されている内容はMAMPにDrupalをインストールしたときの「データベースへの接続」で入力したものがそのまま入っています。

ただ、MAMPはデータベースへの接続方法が少し特殊で、MAMPのMySQLソケットを介して接続する必要があります。

ホストの指定

まず、「'host'」に「localhost」を指定すると、Drushは「ファイルシステムソケット」と呼ばれるソケットに接続しようとします。
逆に「127.0.0.1」に接続するように指示すると、強制的に「ネットワークソケット」と呼ばれるソケットに接続されます。

ソケットというのは、プログラム間でデータの送受信を行うための標準的な仕組みの1つのことです。

一般的に「localhost」と「127.0.0.1」は同じで、ドメインかIPアドレスかの違いとして説明されますが、このようにソケットの接続に微妙な違いがあります。

DrushはMySQLがネットワークソケットのみを要求して、ファイルシステムソケットを要求しないように構成されているようなので、「localhost」ではファイルシステムソケットに接続しようとしてしまい、接続エラーとなってしまいます。

そのため、「localhost」から「127.0.0.1」に変更します。

ソケットの指定

次に「'unix_socket'」にMAMPのMySQLのソケットファイルパスを入力することで、MAMPのMySQLソケットを介して接続できるようになります。

MAMPのデータベースに接続するためには、「ソケット」を明示的に指定する必要があります。
これはDrushの設定に限ったことではなく、たとえばターミナルからMAMPのデータベースに接続したい場合も同様に指定してあげる必要があります。

試しにMAMPの「htdocs」ディレクトリで下記コマンドを実行してMySQLに接続しようとします。

mysql

すると下記のエラーが表示されます。

ターミナルで表示されるエラー
 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

ここでソケットを一緒に指定して再度実行すると、問題なく接続できるようになります。
また、接続にはユーザー名とパスワードも必要なので、オプションで指定しつつ下記コマンドで接続してみます。

mysql -S /Applications/MAMP/tmp/mysql/mysql.sock -u root -p

「Enter password:」が表示されたら、パスワードである「root」を入力してenterを押せば、無事接続できました。
 

ターミナル画面:エラーの解決

 

これと同じ「ソケットの指定」をDrupalの「sites/defaualt/settings.php」に設定して、Drushでデータベースに接続するときに行うようにしているというわけです。

設定してしまえばMAMPでもDrushが使える

MAMPを使っている方の中には、デザイナーさんなど普段あまりコードに触れていない人も多いと思います。

そのような人からすると「せっかく試しにDrushを触ってみようと思ったのに、わけの分からないエラーが出てきて怖い!」となってしまうかもしれません。

何が起こっているのかをいきなり理解するのは難しいかもしれませんが、今回紹介したちょっとした設定をそのままするだけで、すぐ動作するようになります。

一度設定してしまえば、それ以降その環境ではDrushを使えるので、MAMP環境でDrushを試してみたいと思った方は、諦めずにぜひ試してみてください。

 

 

モチヤスタッフ

Drupalなど技術に関する投稿をモチヤのスタッフが行っています。

モチヤスタッフ の書いた記事一覧

最新の関連記事

Ranking

Category

Tag

Contact お問い合わせ

Drupalでの開発・運用、サーバー構築、Webサイト構築全般、制作費用などに関してお気軽にご相談ください。