Проблема, которую вы описываете, связана с ошибкой подключения к MySQL через PDO с сообщением "Connection refused". Это указывает на то, что соединение с базой данных не удалось установить. Давайте разберёмся шаг за шагом, почему это может происходить, и как правильно исправить ситуацию, особенно с учётом того, что вы используете AltLinux Рабочая станция К 11 BETA и настраивали MySQL по мануалу.
Возможные причины проблемы
Пароль root не совпадает с реальным паролем MySQL
Вы указываете password => 'root' в настройках, но это может не соответствовать текущему паролю пользователя root в MySQL. После установки MySQL по умолчанию пароль для root может быть пустым, сгенерированным автоматически или заданным в процессе установки. Если вы следовали мануалу, возможно, там был шаг с установкой пароля, который вы пропустили или неверно интерпретировали.
MySQL не запущен или не слушает указанный хост/порт
Ошибка "Connection refused" часто возникает, когда сервер MySQL не работает или не настроен для прослушивания на 127.0.0.1 (localhost) через TCP/IP. В некоторых конфигурациях MySQL по умолчанию использует сокет вместо TCP, что может вызвать конфликт.
Конфликт с настройками окружения
Вы используете функцию env(), которая берёт значения из переменных окружения. Если переменная DB_PASS не определена или содержит неверное значение, то в коде будет подставлено значение по умолчанию (example), что также может привести к ошибке.
Проблема с версией MySQL или драйвером PDO
В AltLinux Рабочая станция К 11 BETA могла измениться версия MySQL или PHP, что иногда вызывает несовместимость или требует дополнительных настроек.
Некорректная строка DSN
В вашем примере DSN выглядит как 'mysql:host=127.0.0.1;dbname=example'. Если база данных example не существует или MySQL не настроен для доступа через TCP, это тоже вызовет ошибку.
Шаги для диагностики и исправления
1. Проверьте, работает ли MySQL
Убедитесь, что сервер MySQL запущен:
sudo systemctl status mysql
Если он не работает, запустите его:
sudo systemctl start mysql
И включите автозапуск:
sudo systemctl enable mysql
2. Проверьте доступ к MySQL через командную строку
Попробуйте подключиться к MySQL с теми же данными, которые вы используете в коде:
mysql -u root -p
После ввода команды вас попросят ввести пароль. Введите root (или оставьте пустым, если пароль не задан). Если подключение удалось, значит проблема не в пароле, а в настройках PDO или сервера. Если подключение не удалось, вы получите сообщение об ошибке, которое поможет понять причину (например, "Access denied" — неверный пароль, или "Connection refused" — сервер не доступен).
3. Проверьте настройки MySQL
Файл конфигурации MySQL обычно находится в /etc/my.cnf или /etc/mysql/my.cnf. Откройте его:
sudo nano /etc/my.cnf
Ищите секцию [mysqld] и проверьте параметры:
bind-address — должен быть 127.0.0.1 или 0.0.0.0, чтобы сервер слушал TCP-соединения.
port — по умолчанию 3306, убедитесь, что он не изменён.
Если там указано skip-networking, закомментируйте эту строку (добавьте # в начало), чтобы разрешить TCP/IP-соединения.
После изменений перезапустите MySQL:
sudo systemctl restart mysql
4. Убедитесь, что база данных существует
Ваш DSN указывает на базу example. Проверьте, существует ли она:
mysql -u root -p -e "SHOW DATABASES;"
Если базы example нет, создайте её:
mysql -u root -p -e "CREATE DATABASE example;"
5. Проверьте правильность пароля root
Если пароль root не работает, сбросьте его. Войдите в MySQL как root (если пароль пустой, просто нажмите Enter):
mysql -u root
И выполните:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
EXIT;
Теперь пароль точно будет root.
6. Исправьте код
Попробуйте упростить подключение для теста, убрав зависимость от контейнера и env():
$dsn = 'mysql:host=127.0.0.1;dbname=example';
$username = 'root';
$password = 'root';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Подключение успешно!";
} catch (PDOException $e) {
echo "Ошибка подключения: " . $e->getMessage();
}
Сохраните это в файл, например test.php, и запустите:
php test.php
Если ошибка сохраняется, вы увидите точное сообщение, которое поможет дальше.
7. Убедитесь, что порт открыт
MySQL по умолчанию использует порт 3306. Проверьте, слушает ли он этот порт:
sudo netstat -tuln | grep 3306
Если ничего не выводится, MySQL не использует TCP. В этом случае добавьте в DSN порт явно:
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=example';
8. Проверьте переменные окружения
Если вы используете env(), убедитесь, что переменные DB_HOST, DB_NAME, DB_USER, DB_PASS заданы правильно. Например, в файле .env:
DB_HOST=127.0.0.1
DB_NAME=example
DB_USER=root
DB_PASS=root
Или задайте их в терминале перед запуском:
export DB_HOST=127.0.0.1
export DB_NAME=example
export DB_USER=root
export DB_PASS=root
php your_script.php
Почему password = root может быть проблемой?
Сам по себе параметр password = root не является "неприкосновенным" или зарезервированным. Ошибка, скорее всего, не в самом значении 'root', а в том, что:
MySQL отклоняет соединение из-за неверного пароля.
Сервер не доступен по указанному хосту/порту.
В трассировке вы могли видеть что-то вроде "immutable parameter" или "invalid parameter", но это, вероятно, связано с внутренней обработкой PDO, а не с самим паролем.