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

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

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

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

Ответ 1

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

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

Ответ 2

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. fooobar.com/questions/39229/...

Update: Некоторые люди спрашивали, почему это исправление работает, поэтому я немного поработал над этой темой. Кажется, что они используют разные типы соединений, как описано в этом сообщении fooobar.com/questions/39231/...

Проблема, возникшая здесь, заключается в том, что "localhost" использует сокет UNIX и не может найти базу данных в стандартном каталоге. Однако "127.0.0.1" использует протокол TCP (Transmission Control Protocol), который по существу означает, что он работает через "локальный Интернет" на вашем компьютере, будучи намного надежнее, чем сокет UNIX в этом случае.

Ответ 3

У меня та же проблема, и я использую 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',
        ),
    

Теперь просто сохраните изменения и перезагрузите страницу, и она должна работать!

Ответ 4

Я столкнулся с ошибкой [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

Это исправило это для меня.

Ответ 5

Ответ от @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'    => '',
    ),

Ответ 6

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

homestead ssh

Затем просто cd в нужную директорию и запустите там свою команду.

Ответ 7

В моем случае у меня не было никаких проблем, я просто забыл запустить службу MySQL...

sudo service mysqld start

Ответ 8

Опция включения пользователя Mamp Разрешить доступ к сети MYSQL

введите описание изображения здесь

Ответ 9

Добавьте путь 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'),

Ответ 10

Это потому, что PDO обрабатывает хост localhost специально:

Примечание. Только для Unix: если для имени хоста задано значение "localhost", подключение к серверу осуществляется через сокет домена. Если PDO_MYSQL скомпилирован с использованием libmysqlclient, тогда местоположение файла сокета находится в libmysqlclient, скомпилированном в location. Если 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.

Ответ 11

Это сработало после того, как я DB_HOST=localhost с DB_HOST=localhost на DB_HOST=127.0.0.1 в файле .env

Ответ 12

Основываясь на ответе от @dcarrith...

Вместо редактирования файлов конфигурации я создал псевдоним в местоположении, которое ищет PHP, который подключается к реальному mysql.sock. (источник)

Просто запустите эти две команды (перезагрузка не требуется):

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

Ответ 13

Шаг 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' <-----
            ),
        ),

Надеюсь, что это поможет!

Ответ 14

Я работаю на MAMP Pro и сталкивался с подобной проблемой при попытке переноса (создание таблиц db). Пробовал некоторые из этих упомянутых предложений, но не сделал этого для меня.

Итак, просто (через час googling), я добавил две вещи в /config/database.php.

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

Теперь работает отлично!

Ответ 15

Проверьте свой порт тщательно. В моем случае это было 8889, и я использую 8888. измените "DB_HOST" с "localhost" на "127.0.0.1" и наоборот

Ответ 16

Как и в случае с 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

Ответ 17

Я столкнулся с этой проблемой при запуске PHPUnit в Elixir/ Gulp и Homestead в качестве среды моего бродяга.

В моем случае я отредактировал файл .env от DB_HOST=localhost до DB_HOST=192.168.10.10, где 192.168.10.10 - это IP моего хоста-бродяги/хозяина.

Ответ 18

Попытка подключения к 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.

Ответ 19

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

Решение было помещено имя контейнера службы MySQL, который я использовал в docker_compose.yml на DB_HOST. В моем случае это было db:

DB_HOST=db

Надеюсь, поможет.

Ответ 20

Это правильный ответ для меня. Я отключил опцию pdo_mysql.default_socket в моем php.ini и установил хост базы данных на 127.0.0.1.

Ответ 21

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

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

.bash-профиль

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

[email protected]:~/Code/projectFolder  php artisan migrate:install

Ответ 22

У меня были похожие проблемы с доступом к моему веб-сайту Drupal. Я исправил это, открыв командную строку и перезапустив свой сервер MySQL или службу:

service mysqld restart

Это должно работать. Если это не так, перезапустите локальный веб-сервер:

service httpd restart

Этого должно быть достаточно. Надеюсь, что это работает и для других сред. Обратите внимание, что эти команды обычно требуют привилегий суперпользователя.

Ответ 23

Если кто-то все еще ищет ответ, просто проверьте файл .env. По какой-то причине laravel создает файл .env.example, поэтому все эти ответы не сработали для меня. Я исправил свою проблему переименованием .env.example в .env

Ответ 24

Это случилось со мной, потому что MySQL не работал. MySQL не запускался, потому что у меня отсутствовал каталог /usr/local/etc/my.cnf.d/.

Это требуется моему конфигурационному файлу /usr/local/etc/my.cnf в качестве glob include (include /usr/local/etc/my.cnf.d/*.cnf).

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

Ответ 25

В моем случае я запускал php artisan migrate на своем терминале Mac, когда мне нужно было запустить ssh в vagrant и запустить его оттуда. Надеюсь, что кому-то помогает головная боль.

Ответ 26

[Это устарело, информация о базе данных теперь хранится в .env] Более простой способ решить проблему - редактировать

app/config/local/database.php

:)

Измените конфигурацию базы данных здесь, и она должна работать

Ответ 27

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

Ответ 28

В этом случае я просто использовал

vagrant up

вместо

homestead up

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

Ответ 29

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

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

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

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

Ответ 30

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

} 

Надеюсь, поможет!