Я пытаюсь запустить 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", ни одна из которых не помогла.
Я полностью застрял и не знаю, что попробовать дальше.
Я просто столкнулся с этой ошибкой - вы проверили, существует ли схема, которую указывает wp-config.php
?
В моем случае я полностью забыл создать его, поэтому исправление было простым, как CREATE DATABASE wordpress
.
Я также столкнулся с этой ошибкой, когда хост базы данных wp-config.php
ошибочен (попробуйте заменить localhost
и 127.0.0.1
).
Во-первых, убедитесь, что 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
, как и предполагалось.
localhost
в любую конфигурацию приложения, над которым я работаю, я думаю об этом как о доменном имени. Почему это доменное имя становится магической строкой внутри mysqli_real_connect
которая говорит ему подключаться через сокет? Я критикую это, потому что моя проблема, похожая на OP, была следствием использования сервера MySQL в Docker.
Убедитесь, что у вас нет того же префикса таблицы с другой базой данных
Это смутило меня, но я решил в конце концов.
Мой порт 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';
Но я думаю, что наиболее важным является изменение порта.
Просто зайдите в свой phpMyAdmin, нажмите на свою базу данных и скопируйте ip, где выполняется служба, и замените файл wp-config.php:
/** Имя хоста MySQL */ define ('DB_HOST', 'localhost');
/** Имя хоста MySQL */ define ('DB_HOST', 'ip_where_is_running_mysqlserver');
Я мог бы быть исправлен с помощью изменений 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 );
}
В строке отчета в /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 );
Добавьте отсутствующий @
, сохраните и загрузите измененный файл, чтобы исчезнуть предупреждение.