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
Хассан Гілак

Відповіді:


142

Повідомлення про помилку вказує на тест спроби підключення MySQL через сокет (який не підтримується).

У контексті Ларавеля (ремісника), ймовірно, ви хочете використовувати інше / правильне середовище. Наприклад: php artisan migrate --env=production(або будь-яке оточення). Дивіться тут .


1
Це було вирішенням моєї проблеми: один з розробників нашої компанії не використовує Homestead і підключається до mysql через socket. Я видалив конфігурацію сокета в моєму файлі app / database.php. Проблема вирішена
borislemke

Мені просто довелося ввімкнути розширення mysqli.so в php.ini
Mehulkumar

4
Мені довелося додати "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'", щоб налаштувати / database.php
Ángel Carlos del Pozo Muela

привіт, спільнота, я отримую цю помилку, хоча я не використовую laravel, чи можете ви подивитися на проблему, тут це stackoverflow.com/questions/60796332/…
Kiran Patel

655

Laravel 4: Змініть "хост" у app/config/database.phpфайлі з "localhost" на "127.0.0.1"

Laravel 5: Змініть "DB_HOST" у .envфайлі з "localhost" на "127.0.0.1"

У мене була точно така ж проблема. Жодне з перерахованих вище рішень не працювало для мене. Я вирішив проблему, змінивши "хост" у файлі /app/config/database.php з "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 (протокол управління передачею), що по суті означає, що він проходить через "локальний Інтернет" на вашому комп'ютері, набагато надійніше, ніж розетка UNIX в цьому випадку.


3
дивно, що це було рішення і для мене, але я в змозі з'єднатися з командного рядка з mysql --host = localhost - що працює, але не з PDO.
Джон

26
Я хотів би знати, ЧОМУ localhostне працює і 127.0.0.1робить ??
Джастін

6
Це працювало для мене в системі MAMP, що запускає файл php в командному рядку (терміналі). Він працював як веб-сторінка, але не як файл командного рядка, поки я не змінив localhost на '127.0.0.1'
Самуель Фулдман

1
@Justin Я думаю, що це тому, що localhost намагається використовувати socket, тоді як 127.0.0.1 використовує TCP.
pebbo

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/uk/can-not-connect-to-server.html
x-yuri

94

У мене така ж проблема, і я запускаю Mac OS X 10.10 Yosemite. Я ввімкнув Apache Server і PHP, які вже поставляються з ОС. Тоді я просто налаштував бібліотеку mCrypt, щоб розпочати роботу. Після цього, працюючи з моделями та БД, я отримав помилку:

[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 , де ви налаштовуєте параметри з'єднання БД. У розділі 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
Найбільш "прямо на питання" рішення. Дякую, це зафіксувало мене на запуску Laravel з програмою MAMP pro
animaacija

Дякую за це Це працювало для мене. Використання OSX 10.10.5 MAMP Pro
marknt15

Це працювало і для мене, і для MAMP pro та OS X 10.11.x. Закінчено:/Applications/MAMP/tmp/mysql/mysql.sock
Бортовий

1
+1. Використання "127.0.0.1" у конфігурації замість "localhost", як сказав Ямартіно у своїй відповіді, працює добре, але це швидше з сокетом, і ця відповідь вирішує проблему. Соромно, що mysql ставиться до "localhost" таким своєрідним чином, коли визначено
unix_socket

@GregFerrell Так, це правда, але добре ... Я сподіваюся, що це може бути корисним
alexventuraio

51

Я зіткнувся з [PDOException] SQLSTATE[HY000] [2002] No such file or directoryпомилкою з іншої причини. Я щойно закінчив створення нового стека LAMP на Ubuntu 12.04 з Apache 2.4.7, PHP v5.5.10 та MySQL 5.6.16. Я перемістив свої сайти назад і звільнив їх. Але я не міг завантажити свій сайт на базі Laravel 4.2.x через [PDOException]вищезазначене. Отже, я перевірив php -i | grep pdoі помітив цей рядок:

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

Але в моєму /etc/my.cnf файл шкарпетки насправді є /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 та видалив одну, зміна 127.0.0.1 не працювала або додав носок у конфігурацію, дякую! @dcarrith
Луїс

2
Це допомогло мені знайти свою проблему - яка полягала в тому, що я використовував пакетний php з OSX, а не бінарний файл MAMP. Тому переконайтеся, що ви використовуєте правильну версію php, яка вказує на правильну php.ini тощо. Визначте "до!" мить.
dragonflyesque

43

Відповідь від @stuyam вирішила для мене проблему "Немає такого файлу чи каталогу"

Коротка відповідь: Змініть "хост" у файлі /app/config/database.php з "localhost" на "127.0.0.1"

Але потім у мене виникла помилка "З'єднання відмовлено". Якщо у когось була така ж проблема, моє рішення для цього було оновити файл app / config / local / database.php, щоб порт був 8889:

'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

25

Якщо ви використовуєте Laravel Homestead, переконайтесь, що ви викликаєте команди на сервері.

homestead ssh

Тоді просто CD в потрібний каталог і запустіть свою команду там.


2
Це спрацювало, я запустив команду зі свого комп'ютера замість ssh у VM і запустив команду там.
cmac

Я завжди забуваю цей крок. Хе. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Марсель

1
vagrant sshу моєму випадку
Маркос Кервелло

22

У моєму випадку у мене взагалі не було проблем, просто забув запустити сервіс mysql ...

sudo service mysqld start


18

Додайте шлях mysql.sock у файл database.php, як приклад нижче

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

Eample

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

18

Він працював після того, як я міняю від DB_HOST=localhostдо DB_HOST=127.0.0.1в .env файлі


2
Це спрацювало, ви праві. Чи є у вас ідеї, що пояснюють, чому localhostце не працює?
Fusion

1
@Fusion, якщо ви запускаєте додаток у контейнері, він зрозуміє "localhost" як контейнер, 127.0.0.1 повідомляє йому використовувати db хосту
deathemperor

У мене також виникло таке питання, я не міг очистити кеш-пам'ять або запустити службу ремісників
Том Мвенда

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 ...

Замість редагування файлів конфігурації я створив псевдонім у тому місці, яке шукає PHP, який підключається до реального mysql.sock. ( джерело )

Просто запустіть ці дві команди (перезапуск не потрібен):

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). Я також спробував кілька згаданих пропозицій, але не зробив це для мене.

Отже, просто (після години гуглінгу) я додав дві речі до /config/database.php.

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

Зараз добре працює!


4

Уважно перевірте свій порт. У моєму випадку це було 8889, і я використовую 8888. змініть "DB_HOST" з "localhost" на "127.0.0.1" і навпаки


Чудово, дякую, мій порт був 3306, але мій справжній порт - 8889
Девід,

4

У мене виникли проблеми, коли я запускав свою програму за допомогою докерних контейнерів.

Рішення було введено ім'я контейнера служби MySQL, який я використовував у docker_compose.ymlDB_HOST. У моєму випадку це було db:

DB_HOST=db

Сподіваюся, це допомагає.


2

Станом на 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

Я зіткнувся з цією проблемою, коли запускав PHPUnit в Elixir / Gulp, і Homestead, як мій середовище Vagrant.

У моєму випадку я відредагував .env-файл з того DB_HOST=localhostмісця, DB_HOST=192.168.10.10де 192.168.10.10знаходиться IP-адреса мого хозяїна Vagrant / Homestead.


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 Server.


2

У мене були подібні проблеми з доступом до мого веб-сайту Drupal. Я виправив це, відкривши командний рядок та перезапустивши мій сервер або службу MySQL:

service mysqld restart

Це має спрацювати. Якщо цього не відбувається, перезавантажте локальний веб-сервер:

service httpd restart

Цього має бути достатньо. Сподіваюся, що це працює і для інших середовищ. Зауважте, що ці команди, як правило, потребують привілеїв суперпользователя.


1

Якщо ви використовуєте Laravel Homestead, ось налаштування

(включити віртуальну машину)

.bash-профіль

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


На це питання немає єдиної правильної відповіді, оскільки можливі різні помилки. Це одна з них, оскільки не вдалося скопіювати .env файл на віддалений сервер. Тому варто перевірити файл .env на сервері, де ви намагаєтеся запустити запит, щоб переконатися, що він є і містить необхідну інформацію для встановлення з'єднання.
petercoles

1

Це сталося зі мною, оскільки MySQL не працював. MySQL не вдалося запустити, тому що я пропав безвісти/usr/local/etc/my.cnf.d/ каталог.

Цього вимагав мій /usr/local/etc/my.cnfконфігураційний файл як глобул include (include /usr/local/etc/my.cnf.d/*.cnf ).

Запуск mkdir /usr/local/etc/my.cnf.d, а потім запуск MySQL виправили проблему.


1

У моєму випадку я запускав php artisan мігрувати на моєму mac-терміналі, коли мені потрібно було перекинутися в бродягу і запустити його звідти. Сподіваюсь, що комусь допоможе головний біль.


1

У мене була така ж проблема з використанням Docker і MySQL службових назв db у файлі docker_compose.yml:

Я додав у .envфайл таке:

DB_HOST=db

ви також повинні переконатися, що ваш хост можна знайти з програми php.

Це було тому, що PHP не з'ясував, який хост використовувати для підключення.


0

Під час використання VirtualMachine переконайтеся, що ви ввійшли в цю машину і перейдіть до своєї папки програми та зателефонуйте звідти на команду переміщення php artisan.


0

У випадку, я просто використав би

vagrant up

замість

homestead up

для моєї установки кузня личинок за допомогою садиби. Я припускаю, що це означало, що сайт отримує обслуговування, але сервер MySQL ніколи не завантажувався. Коли я застосував останню команду для запуску свого бродячого вікна, помилка усунулася.


0

Всі ці відповіді здаються важким підйомом ...

Я щойно створив .envфайл; редагував мій bootstrap/app.phpфайл і коментував наступний рядок ...

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

Сподіваюся, що це комусь допоможе


0

Для тих, хто намагається створити свіжий db-з'єднання не на laravel, а натрапив сюди, шукаючи відповіді для запуску 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

У моєму випадку мені довелося видалити завантажувальну / кеш-папку і спробувати її ще раз.

Мій cenario був після міграції сервера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.