Предупреждение: mysqli_real_connect (): (HY000 / 2002): нет такого файла или каталога в /private/tmp/wordpress/wp-includes/wp-db.php в строке 1452

5

Я пытаюсь запустить PHPUnit для удаления плагина WordPress, но ошибка в заголовке продолжает отображаться.

Я использовал WP-CLI для настройки unittests, но также WP-CLI бросает аналогичную ошибку, когда я пытаюсь запустить ее.

Я использую MAMP для запуска базы данных.

У меня есть WP-CLI и PHPUnit как phars, которые сглажены в ~/.bash-профиле и запускаются с по умолчанию "php", предоставленным OS X. Изменив это и запустив WP-CLI и PHPUnit с последней версией PHP, поставляемой фиксированным WP-CLI от MAMP (он работал и очень хорошо подключался к базе данных), но PHPUnit все еще бросал ту же ошибку.

Я попытался отредактировать файл wp-config.php и установить хост на ":/path/to/mamp/mysql.socket", "localhost:/path/to/mamp/mysql.socket" и "127.0.0.1", ни одна из которых не помогла.

Я полностью застрял и не знаю, что попробовать дальше.

Показать ещё 1 комментарий
Теги:
mysqli
mysql-connect

7 ответов

12

Я просто столкнулся с этой ошибкой - вы проверили, существует ли схема, которую указывает wp-config.php?

В моем случае я полностью забыл создать его, поэтому исправление было простым, как CREATE DATABASE wordpress.

Я также столкнулся с этой ошибкой, когда хост базы данных wp-config.php ошибочен (попробуйте заменить localhost и 127.0.0.1).

  • 3
    Изменение localhost на 127.0.0.1 сделало это для меня, огромное спасибо!
  • 0
    ОП это решило вашу проблему? @sigsve
Показать ещё 2 комментария
5

Во-первых, убедитесь, что MySql фактически запущен. Он не будет создавать файл сокета, если процесс не запущен.

netstat -tulpn | grep mysql

или

ps -e | grep mysql

Если MySql запущен, изменение хоста базы данных от localhost до 127.0.0.1 в wp-config.php работает, но это только обходной путь.

Когда вы указываете localhost, функция mysqli_real_connect() пытается подключиться к вашей базе данных через сокет Unix, который он не может найти (отсюда ошибка "нет такого файла".) Когда вы указываете 127.0.0.1, он пытается подключитесь к своей базе данных, используя TCP-порт по умолчанию (обычно 3306), который работает.

Это не устраняет проблему, что PHP не знает, где найти ваш сокет MySql. Вам необходимо настроить следующие параметры в php.ini. Место в сокете будет зависеть от вашей ОС, но обычно вы можете найти его, запустив locate mysql.sock. Здесь настройки, которые работают для меня на CentOS 6.8.

php.ini

pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock

Другие системы обычно используют /tmp/mysqld.sock. Вы можете проверить настроенное местоположение, проверив конфигурационный файл MySql my.cfg.

После того, как вы настроили PHP для указания правильного расположения сокетов, перезапустите Apache/nginx, чтобы он забирал новые настройки.

Теперь вы можете использовать localhost, как и предполагалось.

  • 0
    Это очень хорошее объяснение (+1), но позвольте мне критиковать (не Вы, а только решение разработчиков драйвера mysqli): «Когда вы указываете localhost, функция mysqli_real_connect () пытается подключиться к вашей базе данных через сокет Unix, который не может найти «Когда я помещаю строку localhost в любую конфигурацию приложения, над которым я работаю, я думаю об этом как о доменном имени. Почему это доменное имя становится магической строкой внутри mysqli_real_connect которая говорит ему подключаться через сокет? Я критикую это, потому что моя проблема, похожая на OP, была следствием использования сервера MySQL в Docker.
  • 1
    @Marecky Вы задали хороший вопрос. Тем не менее, это не решение MySQL для разработчиков, а основополагающая практика Unix. Когда вы указываете «localhost», он использует локальный сокет Unix. Этот метод на основе файловой системы обеспечивает лучшую безопасность (может использоваться только локально) и лучшую производительность (без издержек TCP). Предоставление любого другого имени хоста или IP-адреса делает внешний вызов, который требует TCP / IP. Так работает сеть Unix. Использование 127.0.0.1 заставляет вашу систему сделать внешний вызов самому себе. Такая конструкция позволяет вам подключаться к вашему серверу так, как это делают внешние клиенты.
Показать ещё 1 комментарий
0

Убедитесь, что у вас нет того же префикса таблицы с другой базой данных

0

Это смутило меня, но я решил в конце концов.

Мой порт MySQL 3308, поэтому я изменяю "127.0.0.1" на "localhost: 3308" в

$cfg['Servers'][$i]['host'].

Оно работает!

Кроме того, я установил

$cfg['Servers'][$i]['controluser'] = '';

$cfg['Servers'][$i]['controlpass'] = '';

А также...

$cfg['Servers'][$i]['auth_type'] = 'cookie';

Но я думаю, что наиболее важным является изменение порта.

0

Просто зайдите в свой phpMyAdmin, нажмите на свою базу данных и скопируйте ip, где выполняется служба, и замените файл wp-config.php:

/** Имя хоста MySQL */ define ('DB_HOST', 'localhost');

/** Имя хоста MySQL */ define ('DB_HOST', 'ip_where_is_running_mysqlserver');

Заменить Localhost на ip запуска MySQL Server

-2

Я мог бы быть исправлен с помощью изменений localhost и 127.0.0.1 в wp-config.php

также установить define('WP_DEBUG', false); было бы хорошим предложением скрыть такие проблемы. Поскольку я мог видеть следующий блок wp-db.php

if ( WP_DEBUG ) {
                mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
            } else {
                @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
            }
-2

В строке отчета в /wp -includes/wp-db.php(строка 1489 в WordPress v 4.5) код читает:

mysqli_real_connect( $this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

Проблема исчезает, добавляя @ спереди. Поэтому код должен выглядеть следующим образом:

@mysqli_real_connect( $this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

Добавьте отсутствующий @, сохраните и загрузите измененный файл, чтобы исчезнуть предупреждение.

  • 4
    Это ужасный совет. Подавление ошибки не решает проблему. Это только подметает это под ковриком. К сожалению, есть разработчики, которые на самом деле сделали бы это.
  • 0
    Произошла ошибка в кодировке WP. Это было исправлено в более поздних версиях WordPress, добавив отсутствующий символ @, как отмечено выше. Это можно увидеть в строке 1531 в v4.7.3. Таким образом, похоже, что разработчики WP сделали необходимую разметку, чтобы исправить ошибку.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню