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

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

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

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

39 ответов

Решение

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

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

Laravel 4: смените "хост" в 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. /questions/9241237/ustranenie-nepoladok-net-takogo-fajla-ili-kataloga-pri-zapuske-php-appconsole-doctrineschemacreate/9241273#9241273

Обновление: некоторые люди спрашивают, почему это исправление работает, поэтому я немного изучил эту тему. Кажется, что они используют разные типы соединений, как описано в этом посте /questions/25795925/php-mysql-raznitsa-mezhdu-127001-i-localhost/25795937#25795937

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

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

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

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

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

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

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

sudo service mysqld start

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

homestead ssh

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

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

Это связано с тем, что 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.

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

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

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

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

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

Опираясь на ответ @dcarrith ...

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

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

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

Just i do one change in .env file

I have following line of code.

      DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=la_slotted_app
DB_USERNAME=root
DB_PASSWORD=

Change host name localhost to 127.0.0.1

      DB_CONNECTION=mysql
DB_HOST=127.0.01
DB_PORT=3306
DB_DATABASE=la_slotted_app
DB_USERNAME=root
DB_PASSWORD=

That is work in my case because that can't find any hostname like localhost

And after changing hostname write following command

      php artisan config:clear
php artisan migrate:install

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

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

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

Работает нормально сейчас!

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

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

DB_HOST=db

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

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

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

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

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

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

DB_HOST=db

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

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

У меня были проблемы с доступом к моему сайту Drupal, и у меня была проблема, точно такая же, как и то, что я исправил ее менее чем за 2 часа Попробуйте в командной строке и перезапустите сервер MySQL или службу. Введите это при входе в систему как root или суперпользователь, - перезапуск службы mysqld

Он должен работать. If it doesn't restart your local webserver, - service httpd restart

Этого должно быть достаточно. Hope it works for other environments too. Приветствия.

I got the same problem in ubuntu 18.04 with nginx. By following the below steps my issue has been fixd:

First open terminal and enter into mysql CLI. To check mysql socket location I write the following command.

      mysql> show variables like '%sock%'

I got something like the below :

      +-----------------------------------------+-----------------------------+
| Variable_name                           | Value                       |
+-----------------------------------------+-----------------------------+
| mysqlx_socket                           | /var/run/mysqld/mysqlx.sock |
| performance_schema_max_socket_classes   | 10                          |
| performance_schema_max_socket_instances | -1                          |
| socket                                  | /var/run/mysqld/mysqld.sock |
+-----------------------------------------+-----------------------------+
4 rows in set (0.00 sec)

In laravel project folder, look for the database.php file in the config folder. In the mysql section I modified unix_socket according to the above table.

      'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'database'  => 'database_name',
        'username'  => 'username',
        'password'  => 'password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'unix_socket' => '/var/run/mysqld/mysqld.sock',
    ),

Now just save changes, and reload the page and it worked.

решено

в моем случае это была логическая проблема в коде, значения соединения находятся в операторе if:

      if($_SERVER['HTTP_HOST'] == "localhost")

поэтому решением было добавить канал и добавить 127.0.0.1, что решило проблему для меня.

      if($_SERVER['HTTP_HOST'] == "localhost" || $_SERVER['HTTP_HOST'] == "127.0.0.1")

Начиная с 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

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

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

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

Если вы используете 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

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

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

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

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

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

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

Другие вопросы по тегам