web-dev-qa-db-ja.com

PDOException SQLSTATE [HY000] [2002]該当するファイルまたはディレクトリがない

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

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

私のテーブルがあるので、ある時点で移行はうまくいったに違いありません。

242
Daniel Hollands

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

Laravel(職人)の文脈では、おそらく異なる/正しい環境を使いたいでしょう。例:php artisan migrate --env=production(またはどんな環境でも)。 ここ を参照してください。

110
ukautz

Laravel 4: app/config/database.phpファイルの "Host"を "localhost"から "127.0.0.1"に変更

Laravel 5: .envファイルの "DB_Host"を "localhost"から "127.0.0.1"に変更

私はまったく同じ問題を抱えていました。上記の解決策のどれも私のために働きませんでした。 /app/config/database.phpファイルの "Host"を "localhost"から "127.0.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ソケットよりもはるかに信頼性が高く、コンピュータ上の "ローカルインターネット"を経由することを意味します。

556
stuyam

私は同じ問題を抱えていて、私はMac OS X 10.10 Yosemiteを使っています。私はApache ServerとPHPを有効にしました。これはすでにOSに付属しています。それでは、mCryptライブラリを設定しました。その後モデルとDBを扱っていたときにエラーが発生しました。

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

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

  1. 端末を開き、次のようにしてmysqlに接続します。

    mysql -u root -p
    
  2. 関連するパスワードを聞いてきます。それならmysqlのプロンプトが表示されたら次のコマンドを入力してください。

    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',
        ),
    

変更を保存してページをリロードするだけでうまくいきます。

76
Alex Ventura

別の理由で[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

それは私のためにそれを修正しました。

45
dcarrith

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

短い答え:/app/config/database.phpファイルの "Host"を "localhost"から "127.0.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'    => '',
    ),
40
Marlow

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

Homestead ssh

それから、正しいディレクトリにcdして、そこでコマンドを実行してください。

22
Koen B.

ユーザー有効化オプションMYSQLへのネットワークアクセスを許可する

enter image description here

16
George John

私の場合、私はまったく問題がなかった、ちょうどMySQLサービスを開始するのを忘れていました...

Sudo service mysqld start
16
Carlos ABS

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

'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'),
14
RaviNila

これは、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
Thomas Decaux

.envファイルでDB_Host=localhostからDB_Host=127.0.0.1に変更した後でうまくいきました

11
NuOne

@dcarrithからの回答をもとに...

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

これら2つのコマンドを実行するだけです(再起動は不要です)。

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

ステップ1

あなたのunix_socketへのパスを見つけ、それを実行するにはnetstat -ln | grep mysqlを実行するだけです。

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

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

ステップ2

それを持ってあなたの unix_socket paramにそれを追加してください。

'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' <-----
            ),
        ),

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

10
kyo

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

それで、単純に(1時間のグーグルの後)、/ config/database.phpに二つのことを追加しました。

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

今正常に動作します!

7
anoraq

ポートを慎重に確認してください。私の場合は8889で、8888を使用しています。 "DB_Host"を "localhost"から "127.0.0.1"に変更します。

3
Ahmed Awan

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

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

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

    '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
malhal

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

私の場合は、.envファイルをDB_Host=localhostからDB_Host=192.168.10.10に編集しました。ここで、192.168.10.10は私のVagrant/Homestead HostのIPです。

2
user5373314

Laravel Homesteadを使用している場合は、ここに

(Vagrant-Virtual Machineを含む)

.bash-profile

alias vm="ssh [email protected] -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
ErcanE

それでも回答を探している人がいる場合は、.envファイルを確認してください。どういうわけかlaravelが.env.exampleファイルを作成したので、これらすべての答えが私にはうまくいきませんでした。私は私の問題を修正します。

1
Alberto Alegria

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

解決策は私が使っていたMySQLサービスコンテナの名前をDB_Hostのdocker_compose.ymlに入れました。私の場合、それはdbでした。

DB_Host=db

それが役に立てば幸い。

1
Lano

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 Serverを停止して起動します。

1
Anna Logg

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

これは私の/usr/local/etc/my.cnf設定ファイルにglobインクルード(include /usr/local/etc/my.cnf.d/*.cnf)として要求されていました。

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

1
james2doyle

私の場合は、vagrantにSSH接続してそこから実行する必要があるときに、私のMac端末でphp artisan migrateを実行していました。誰かが頭痛の種になることを願っています。

1
Brad

仮想マシンを使用するときは、必ずそのマシンにアクセスしてAppフォルダに移動し、そこからphp artisan migrateコマンドを呼び出してください。

0
cmac

場合によっては、私は単に使用したい

vagrant up

の代わりに

Homestead up

homesteadを使用して私の偽造の幼虫のセットアップのために。私はこれがそのサイトが提供されていたことを意味していると思いますが、MySQLサーバーは決して起動されませんでした。後者のコマンドを使って私のvagrant boxを立ち上げると、エラーは消えました。

0
Ben Wilson

これらすべての答えは大変な作業のようです...

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

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

これが誰かに役立つことを願っています

0
MrMesees

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

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

0
Raphael Cangucu

私は私のDrupalウェブサイトにアクセスする際に同様の問題を抱えていた。コマンドラインを開き、MySQLサーバーまたはサービスを再起動することで修正しました。

service mysqld restart

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

service httpd restart

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

0
RAWGIT

新しいレベルではないdb接続を作成しようとしている人のために、ターミナルからPDOを実行するための回答を求めてここにぶつかった。これはあなたにとって助けになるでしょう。そして、あなたはそれをあなたにとって最適に働くようにリファクタリングすることができます。

<?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
Ifeanyi Amadi