PDOException SQLSTATE [HY000] [2002]そのようなファイルまたはディレクトリはありません


319

(非常に基本的な)サイトをfortrabbitに正常に展開できたと思いますが、SSHに接続していくつかのコマンド(php artisan migrateまたはなどphp artisan db:seed)を実行するとすぐに、エラーメッセージが表示されます。

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

テーブルがそこにあるので、ある時点で移行はうまくいったはずです-しかし、これはなぜそれが今私のために働いていないのかを説明していません。



1
mysqlをまだインストールしていないという理由だけで時々
Hassan Gilak

回答:


142

エラーメッセージは、ソケットを介したMySQL接続が試行されたことを示します(これはサポートされていません)。

Laravel(職人)のコンテキストでは、おそらく別の/正しい環境を使用する必要があります。例:(php artisan migrate --env=productionまたは任意の環境)。こちらをご覧ください


1
これが私の問題の解決策でした。当社の開発者の1人がHomesteadを使用せず、ソケット経由でmysqlに接続しています。app / database.phpファイル内のソケット構成を削除しました。問題の解決
borislemke

私はphp.iniでmysqli.so拡張を有効にする必要がありました
Mehulkumar 2017

4
私は「『unix_socket』 => 『/Applications/MAMP/tmp/mysql/mysql.sock』」を追加する必要がありましたへのconfig / database.phpで
アンヘル・カルロス・デル・ポゾムエラ

コミュニティこんにちは、私はlaravelを使用していないにもかかわらず、このエラーを取得しています。あなたは問題を見ることができますここにあるstackoverflow.com/questions/60796332/...
キランパテル

655

Laravel 4:app/config/database.phpファイルの「ホスト」を「localhost」から「12.7.0.1」に変更します

Laravel 5:.envファイルの「DB_HOST」を「localhost」から「12.7.0.1」に変更します

私はまったく同じ問題を抱えていました。上記の解決策のどれも私にとってうまくいきませんでした。/app/config/database.phpファイルの「ホスト」を「localhost」から「12.7.0.1」に変更することで問題を解決しました。

「localhost」がデフォルトで機能しない理由はわかりませんが、symfony2の投稿で解決された同様の質問でこの答えを見つけました。https://stackoverflow.com/a/9251924/1231563

更新: この修正が機能する理由を尋ねる人がいるため、このトピックについて少し調査しました。この投稿で説明されているように、それらは異なる接続タイプを使用しているようですhttps://stackoverflow.com/a/9715164/1231563

ここで発生した問題は、「localhost」がUNIXソケットを使用しており、標準ディレクトリでデータベースを見つけられないことです。ただし、「127.0.0.1」はTCP(Transmission Control Protocol)を使用します。これは、基本的に、コンピューターの「ローカルインターネット」を介して実行されることを意味し、この場合、UNIXソケットよりもはるかに信頼性が高くなります。


3
私にとってもそれが解決策であったことは奇妙ですが、mysql --host = localhostを使用してコマンドラインから接続できます-これは機能しますが、PDOからはできません。
John

26
なぜlocalhost機能しないのか知りたいのです127.0.0.1が?
ジャスティン

6
これは、コマンドライン(ターミナル)でphpファイルを実行しているMAMPシステムで機能しました。ローカルホストを「127.0.0.1」に変更するまで、Webページとしては機能しましたが、コマンドラインファイルとしては機能しませんでした
Samuel Fullman

1
@Justin 127.0.0.1がTCPを使用する一方で、localhostがソケットを使用しようとするためだと思います。
ペボ2015

10
A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
x-yuri

94

同じ問題が発生し、Mac OS X 10.10 Yosemiteを実行しています。OSに付属しているApacheサーバーとPHPを有効にしました。次に、mCryptライブラリーを構成して開始しました。その後、モデルとDBを操作していたときにエラーが発生しました:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

私が見つけた理由は、PHPとMySQLが接続できないからです。この問題を修正するには、次の手順に従います。

  1. ターミナルを開き、mysqlに次のように接続します。

    mysql -u root -p
  2. 関連するパスワードの入力を求められます。次に、mysql promtを取得したら、次のコマンドを入力します。

    mysql> show variables like '%sock%'
  3. あなたはこのようなものを得るでしょう:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. 最後の行の値を保持します。

    /tmp/mysql.sock
  5. あなたにはlaravelプロジェクトフォルダを探しdatabase.phpであなたがDB接続パラメータを設定する場所のファイルがあります。でmysqlのセクション末尾に次の行を追加します。

    'unix_socket' => '/tmp/mysql.sock'
  6. 次のようなものが必要です。

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),

変更を保存し、ページをリロードすれば動作するはずです!


3
最も「ストレートな発行」ソリューション。ありがとう、これにより、MAMPプロでLaravelを実行する際の問題が解決しました
animaacija

これをありがとう。これでうまくいきました。OSX 10.10.5 MAMP Proの使用
marknt15

これは、MAMPプロとOS X 10.11.xでも同様に機能しました。/Applications/MAMP/tmp/mysql/mysql.sock
最終的

1
+1。Yamartinoが彼の回答で言ったように、「localhost」の代わりに「127.0.0.1」を設定で使用するとうまくいきますが、ソケットを使用するとより速く、この回答で問題が解決します。しかし、unix_socketが定義されている場合、mysqlが「localhost」をこのような特殊な方法で処理するのは残念です...
Shautieh

@GregFerrellええ、それは本当ですが、まあ...それが役に立つことを願っています
アレクベンチュラ

51

私が遭遇した[PDOException] SQLSTATE[HY000] [2002] No such file or directory別の理由でエラーが発生しました。私は、Apache 2.4.7、PHP v5.5.10、およびMySQL 5.6.16を備えたUbuntu 12.04で、まったく新しいLAMPスタックの構築を終えたところです。私は自分のサイトを元に戻し、解雇しました。しかし、[PDOException]上記の理由により、Laravel 4.2.xベースのサイトをロードできませんでした。だから、私php -i | grep pdoはこの行をチェックして気づきました:

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

しかし、私の/etc/my.cnfでは、sockファイルは実際にはにあり/var/run/mysqld/mysqld.sockます。

そこで、php.iniを開いて次の値を設定しますpdo_mysql.default_socket

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

次に、Apacheを再起動して確認しましたphp -i | grep pdo

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

これで解決しました。


これは私にとってうまくいった修正でした、問題はmysqlの2つのバージョンをインストールして1つを削除したことでした。127.0.0.1の変更が機能しなかったか、設定にsockを追加しました。ありがとう!@dcarrith
Luis、

2
これは私の問題を見つけるのに役立ちました-MAMP phpバイナリではなく、OSXバンドルのphpを使用していたということです。したがって、正しいphp.iniなどを指す正しいバージョンのphpを使用していることを確認してください。明確な「doh!」瞬間。
dragonflyesque

43

@stuyamからの回答で、「そのようなファイルまたはディレクトリはありません」という問題が解決しました

短い答え:/app/config/database.phpファイルの「ホスト」を「localhost」から「12.7.0.1」に変更します

しかし、「接続が拒否されました」というエラーが発生しました。誰かが同じ問題を抱えている場合、これに対する私の解決策は、ポートが8889になるようにapp / config / local / database.phpファイルを更新することでした:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

4
私の場合はそうでした'port' => '33060'が、この答えは私をそこに導きました!
mopo922 2015年

26

Laravel Homesteadを使用している場合は、サーバー上のコマンドを呼び出していることを確認してください。

homestead ssh

次に、正しいディレクトリにcdし、そこでコマンドを実行します。


2
これはうまくいきました、私は最初にVMにsshではなく自分のコンピューターからコマンドを実行し、そこでコマンドを実行していました。
cmac

私はいつもこのステップを忘れています。へえ。1. source ~/.zshrc2. homestead up --provision3.homestead ssh
マルセル

1
vagrant ssh私の場合
Marcos Curvello

22

私の場合、問題はまったくありませんでした。mysqlサービスを開始するのを忘れただけです...

sudo service mysqld start


18

以下の例のように、mysql.sockパスをdatabase.phpファイルに追加します。

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),

18

それから、私の変更後に働いたDB_HOST=localhostDB_HOST=127.0.0.1.envファイルで


2
これはうまくいきました、あなたは正しいです。なぜlocalhost機能しないのかを説明するアイデアはありますか?
Fusion

1
@Fusionは、コンテナー内でアプリを実行している場合、コンテナーとして「localhost」を理解します
。127.0.0.1

私にもこのような問題があり、キャッシュをクリアしたり、職人のサーブを実行したりできませんでした
Tom Mwenda

17

これは、PDOが「localhost」ホストを特別に扱うためです。

注:UNIXのみ:ホスト名が「localhost」に設定されている場合、サーバーへの接続はドメインソケットを介して行われます。PDO_MYSQLがlibmysqlclientに対してコンパイルされている場合、ソケットファイルの場所はlibmysqlclientのコンパイル場所にあります。PDO_MYSQLがmysqlndに対してコンパイルされている場合、pdo_mysql.default_socket設定を通じてデフォルトのソケットを設定できます。

http://php.net/manual/en/ref.pdo-mysql.connection.phpから)

localhostを127.0.0.1に変更すると、TCPの使用が「強制」されます。

注:mysqli_connectはlocalhostで正常に動作しています。


12

@dcarrithからの答えを基にして...

設定ファイルを編集する代わりに、実際のmysql.sockに接続する、PHPが探している場所にエイリアスを作成しました。(ソース

次の2つのコマンドを実行するだけです(再起動は必要ありません)。

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock

11

ステップ1

unix_socketへのパスを見つけて、実行するだけです netstat -ln | grep mysql

あなたはこのようなものを手に入れるべきです

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

ステップ2

それを取り、あなたのunix_socketパラメータに追加してください

'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

それが役に立てば幸い !!


8

私はMAMP Proで実行していて、移行(dbテーブルの作成)を試行するときにこのような問題が発生しました。これらの言及された提案のいくつかも試してみましたが、私のためにそれをしませんでした。

したがって、単純に(1時間グーグル操作した後)、/ config / database.phpに2つのものを追加しました。

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'

今は正常に動作します!


4

ポートを注意深く確認してください。私の場合は8889で、8888を使用しています。「DB_HOST」を「localhost」から「127.0.0.1」に変更します。


ありがとう、私のポートは3306でしたが、実際のポートは8889です
David

4

Dockerコンテナーを使用してアプリケーションを実行しているときに、この問題が発生しました。

ソリューションには、docker_compose.ymlDB_HOSTで使用していたMySQLサービスコンテナーの名前が付けられました。私の場合、それはdb

DB_HOST=db

それが役に立てば幸い。


2

Laravel 5以降、データベースのユーザー名とパスワードは、プロジェクトディレクトリにある.envファイルに格納されます。例:

DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1

ご覧のとおり、これらの環境変数は「フォージ」文字列をオーバーライドしているため、変更しても効果はありません。

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

詳細はこちらhttps://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Elixir / GulpでPHPUnitを実行しているときにこの問題に遭遇し、Vagrant環境としてHomesteadを実行しました。

私の場合は、から.envファイルを編集しDB_HOST=localhostDB_HOST=192.168.10.10どこ192.168.10.10私ベイグラント/ホームステッドホストのIPです。


2

localhostへの接続を試みます:

SQLSTATE[HY000] [2002] No such file or directory

127.0.0.1への接続を試みます。

SQLSTATE[HY000] [2002] Connection refused

次の設定をmy.cnf(OS X 10.5の場合/opt/local/etc/mysqlxx/my.cnf)からコメント/削除して取得します。

[mysqld]
# skip-networking

もちろん、MySQLサーバーを停止して再起動します。


2

Drupal Webサイトへのアクセスで同様の問題が発生しました。コマンドラインを開き、MySQLサーバーまたはサービスを再起動して修正しました。

service mysqld restart

これはうまくいくはずです。そうでない場合は、ローカルウェブサーバーを再起動します。

service httpd restart

それで十分でしょう。他の環境でも動作することを願っています。これらのコマンドには通常、スーパーユーザー権限が必要です。


1

Laravel Homesteadを使用している場合、ここに設定があります

(Vagrant-Virtual Machineを含む)

.bash-profile

alias vm="ssh vagrant@127.0.0.1 -p 2222"

database.php

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'homestead'),
        'username'  => env('DB_USERNAME', 'homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

ターミナル

vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

それでも誰かが回答を探している場合は、.envファイルを確認してください。何らかの理由でlaravelが.env.exampleファイルを作成するので、このすべての答えは私にとってうまくいきませんでした。.env.exampleを.envに名前変更する問題を修正しました


さまざまなエラーが発生する可能性があるため、この質問に対する正しい答えは1つではありません。これはその1つであり、.envファイルをリモートサーバーにコピーできません。したがって、クエリを実行しようとしているサーバー上の.envファイルをチェックして、クエリが存在し、接続を確立するために必要な情報が含まれていることを確認することをお勧めします。
petercoles

1

これは、MySQLが実行されていなかったために起こりました。/usr/local/etc/my.cnf.d/ディレクトリが見つからないため、MySQLを起動できませんでした。

これは/usr/local/etc/my.cnf、グロブインクルード(include /usr/local/etc/my.cnf.d/*.cnf)として私の設定ファイルで必要でした。

を実行してmkdir /usr/local/etc/my.cnf.dからMySQLを起動すると、問題が修正されました。


1

私の場合、私は自分のMac端末でphp artisan migrateを実行していました。このとき、vagrantにsshしてそこから実行する必要がありました。それが誰かの頭痛を助けることを願っています。


1

dbdocker_compose.ymlファイルでDockerとMySQLサービス名を使用して同じ問題が発生しました:

.envファイルに以下を追加しました:

DB_HOST=db

また、ホストがphpアプリから検出可能であることを確認する必要があります。

これは、接続に使用するホストがPHPで認識されなかったためです。


0

VirtualMachineを使用する場合は、そのマシンにsshして、Appフォルダーに移動し、そこからphp artisan migrateコマンドを呼び出してください。


0

5月の場合、私は単に使用した

vagrant up

の代わりに

homestead up

ホームステッドを使用して私の偽の幼虫のセットアップ。これは、サイトが提供されていることを意味すると思いますが、MySQLサーバーは起動されていません。後者のコマンドを使用して迷惑なボックスを起動すると、エラーは発生しなくなりました。


0

これらすべての答えは重労働のように見えます...

.envファイルを作成しました。私のbootstrap/app.phpファイルを編集し、次の行のコメントを外しました...

Dotenv::load(__DIR__.'/../');

これが誰かを助けることを願っています


0

laravel上ではなく、ターミナルからPDOを実行するための答えを求めてここにぶつかって、新しいdb接続を作成しようとしている人のために。これは役に立ちます。そして、あなたはそれをあなたのために最もよく働くようにリファクタリングできます。

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run shell command to get 
           $socks = shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 

それが役に立てば幸い!


0

私の場合、bootstrap / cacheフォルダーを削除して、もう一度試す必要がありました。

私のシナリオは、サーバーの移行後です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.