PDOException SQLSTATE [HY000] [2002] Нет такого файла или каталога


320

Я считаю, что я успешно развернул свой (очень простой) сайт на fortrabbit, но как только я подключаюсь к SSH для выполнения некоторых команд (например, php artisan migrateили php artisan db:seed), я получаю сообщение об ошибке:

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

В какой-то момент миграция, должно быть, сработала, потому что мои таблицы есть - но это не объясняет, почему это не работает для меня сейчас.



1
иногда это только потому, что вы еще не установили mysql
Хасан Гилак

Ответы:


142

Сообщение об ошибке указывает, что пробное соединение MySQL через сокет (что не поддерживается).

В контексте Laravel (ремесленник) вы, вероятно, хотите использовать другую / правильную среду. Например: php artisan migrate --env=production(или любая другая среда). Смотрите здесь .


1
Это было решением моей проблемы, один из разработчиков в нашей компании не использует Homestead и подключается к mysql через сокет. Я удалил конфигурацию сокета в своем файле app / database.php. Проблема решена
борислемке

Мне просто нужно было включить расширение mysqli.so в php.ini
Mehulkumar,

4
Мне пришлось добавить "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" в config / database.php
Анхель Карлос дель Посо Муэла

Привет, сообщество, я получаю эту ошибку, хотя я не использую laravel. Можете ли вы взглянуть на проблему здесь: stackoverflow.com/questions/60796332/…
Киран Патель

656

Laravel 4: Измените «host» в app/config/database.phpфайле с «localhost» на «127.0.0.1»

Laravel 5: Измените «DB_HOST» в .envфайле с «localhost» на «127.0.0.1»

У меня была точно такая же проблема. Ни одно из вышеперечисленных решений не помогло мне. Я решил проблему, изменив «host» в файле /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 (Transmission Control Protocol), что по сути означает, что он работает через «локальный интернет» на вашем компьютере, будучи гораздо более надежным, чем сокет UNIX в этом случае.


3
странно, что это было решение для меня тоже, но я могу подключиться из командной строки с mysql --host = localhost - это работает, но не из PDO.
Джон

26
Я хотел бы знать, почему localhostне работает и 127.0.0.1работает ??
Джастин

6
Это сработало для меня в системе MAMP с php-файлом в командной строке (терминал). Он работал как веб-страница, но не как файл командной строки, пока я не изменил localhost на «127.0.0.1»
Сэмюэль Фуллман

1
@ Justin Я думаю, это потому, что localhost пытается использовать сокет, а 127.0.0.1 использует TCP.
Пеббо

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

94

У меня та же проблема, и я использую Mac OS X 10.10 Yosemite. Я включил сервер Apache и 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 файл 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 и удалил одну, изменение 127.0.0.1 не сработало или не добавил носок в конфигурацию, спасибо! @dcarrith
Луис

2
Это помогло мне найти мою проблему - я использовал php из OSX, а не бинарный файл MAMP php. Поэтому убедитесь, что вы используете правильную версию php, которая указывает на правильный php.ini и т. Д. Определенное «doh!» момент.
стрекоза

43

Ответ @stuyam решил проблему «Нет такого файла или каталога» для меня

Краткий ответ: измените «host» в файле /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

26

Если вы используете Laravel Homestead, убедитесь, что вы вызываете команды на сервере.

homestead ssh

Затем просто перейдите в нужный каталог и запустите там свою команду.


2
Это сработало, я запускал команду с моего компьютера вместо ssh в VM и запускал команду там.
КЦР

Я всегда забываю этот шаг. Хех. 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, и у меня возникла подобная проблема при попытке миграции (создание таблиц БД). Пробовал несколько из упомянутых предложений, но не сделал это для меня.

Итак, просто (после часа поиска в Google) я добавил две вещи в /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

У меня были эти проблемы, когда я запускал свое приложение, используя Docker-контейнеры.

Решение было помещено имя контейнера службы 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, вот настройки

(включая Vagrant-Virtual Machine)

.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 migrate на своем терминале Mac, когда мне нужно было запустить ssh в vagrant и запустить его оттуда. Надеюсь, что кому-то помогает головная боль.


1

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

Я добавил следующее в .envфайл:

DB_HOST=db

Вы также должны убедиться, что ваш хост доступен для обнаружения из приложения php.

Это было потому, что PHP не выяснил, какой хост использовать для подключения.


0

При использовании VirtualMachine убедитесь, что вы подключились к этой машине, перейдите в папку приложения и оттуда вызовете команду php artisan migrate.


0

В любом случае, я бы просто использовал

vagrant up

вместо того

homestead up

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


0

Все эти ответы кажутся тяжелыми ...

Я только что создал .envфайл; отредактировал мой bootstrap/app.phpфайл и раскомментировал следующую строку ...

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

Надеюсь, это поможет кому-то


0

Для тех, кто пытается создать новое соединение БД не на 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

В моем случае мне пришлось удалить папку bootstrap / cache и повторить попытку.

Мой cenario был после миграции сервера.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.