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 не могут соединиться друг с другом. Чтобы решить эту проблему, я следую следующие шаги:
-
Откройте терминал и подключитесь к mysql с помощью:
mysql -u root -p
-
Он попросит вас ввести соответствующий пароль. Затем, как только вы получите запрос MySQL, введите следующую команду:
mysql> show variables like '%sock%'
-
Вы получите что-то вроде этого:
+-----------------------------------------+-----------------+
| Variable_name | Value |
+-----------------------------------------+-----------------+
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | 322 |
| socket | /tmp/mysql.sock |
+-----------------------------------------+-----------------+
-
Сохранить значение последней строки:
/tmp/mysql.sock
-
В папке вашего проекта laravel
найдите файл database.php, в котором вы конфигурируете параметры подключения к БД. В разделе mysql добавьте следующую строку в конце:
'unix_socket' => '/tmp/mysql.sock'
-
У вас должно быть что-то вроде этого:
'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
}
Надеюсь, поможет!