Непонятная проблема с PDO: не удается подключиться через сокет / доступ запрещен / невозможно подключиться к серверу (общий хост) - PullRequest
15 голосов
/ 26 января 2010

Таким образом, проблема изменилась по сравнению с тем, что было, я оставлю оригинальный вопрос ниже, чтобы избежать плохих отзывов на ответы, которые были у меня после того, как кто-то отредактировал его вопрос, на который я ответил:

Итак, я работаю на (действительно слабом) виртуальном хостинге, на котором установлен PDO, но он не работает. С параметрами по умолчанию

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

выдает это сообщение:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

С простым mysql_connect это работает.

И путь к сокету кажется правильным (и phpinfo, и этот запрос:

show variables like 'socket';

подтверждение.

Localhost перенаправляет на 10.103.0.14 (эти данные поступают из mysql_get_host_info () и из phpMyAdmin)

В PDO, если я заменю localhost на 127.0.0.1, я получу

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 

И если я заменю localhost на 10.103.0.14:

Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES

Оба IP-адреса (127.0.0.1 и 10.103.0.14) работают с mysql_connect.

Так что, очевидно, проблема в соединении PDO.

Кто-нибудь знает, откуда это может прийти и / или каким-либо образом это исправить?

Некоторые данные сервера:

Версия PHP: 5.2.10 Вы можете увидеть phpinfo сервера: http://web.lerelaisinternet.com/abcd.php?v=5 Командная строка невозможна. (я знаю, что это должна быть работа техподдержки, но они слишком медленные)

Спасибо

Предыдущий вопрос:

Как найти mysql.sock на общем хосте (нужен хитрый способ ...)

Итак, сегодняшняя проблема заключается в следующем: соединение PDO не работает на общем хосте, и оно должно (оно установлено на сервере). Просто базовое соединение PDO:

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

выдает это сообщение:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Обычное соединение mysql:

mysql_connect("localhost", "THE_USER", "THE_PWD") or die(mysql_error()); 
mysql_select_db("24DLJLRR1") or die(mysql_error());;
echo 'Connected to database <br/>';

отлично работает.

Так что, очевидно, он не может найти .sock. Я думаю, что указание правильного адреса должно работать, я попробовал какой-то «классический» путь MySQL, который я нашел в Интернете, но безуспешно. Phpinfo говорит, что это по этому адресу (/var/lib/mysql/mysql.sock) (Версия PHP 5.2.10) Вы можете увидеть phpinfo сервера: http://web.lerelaisinternet.com/abcd.php?v=5

Так что я пытаюсь выяснить, где, черт возьми, это !!! Я попытался посмотреть в интерфейсе phpMyAdmin, но не смог найти информацию, плюс мне кажется, что phpMyAdmin подключается к другому серверу (у него другой IP-адрес, и при попытке подключиться к нему с помощью php выдается «Неверный пароль»). ошибка). Mysql_connect также подключается к этому адресу, я думаю, что он перенаправляет на другой сервер с некоторым внутренним паролем / логином.

Хорошо, если у вас есть идея, как получить эту информацию (техническая поддержка провайдера "решает проблему" ... прошло 1 месяц ...). Также, возможно, проблема в другом месте, но то же самое работает на других общих хостах ...

Необходимость PDO заключается в том, что для этого веб-сайта я использую инфраструктуру Symfony с Doctrine, а плагину Doctrine требуется PDO ... Я не хочу переделывать веб-сайт с нуля!

Спасибо за вашу помощь!

Ответы [ 14 ]

21 голосов
/ 10 июня 2011

Это уже было помечено как ответ, но не решено (без изменения баз данных). Так что, на случай, если кто-то вроде меня тоже столкнется с этой проблемой ...

Самый простой способ исправить это - сначала получить путь к сокету (либо просмотрев файл php.ini, либо используя: phpmyadmin или консоль (или сконструировав его в mysql или mysqli)

... чтобы выполнить следующий запрос (любой, кроме PDO):

show variables like 'socket';       //as mentioned by symcbean

THEN, в строке подключения PDO измените ее на использование сокета вместо имени хоста:

$ dbc = new PDO ( "MySQL: UNIX_SOCKET = / вар / запустить / туздЫ / mysqld.sock; имя_бд = $ DBName", $ User, $ Password, array (PDO :: ATTR_PERSISTENT => true)); // с помощью постоянные соединения

Это сработало для меня.

15 голосов
/ 10 февраля 2011

FWIW, у меня возникла эта проблема, и я изменил свой хост с «localhost» на «127.0.0.1».

Понятия не имею, почему localhost не работал, но это помогло.

Странно то, что у нас есть тонны серверов, и они работают почти на каждом, используя localhost

7 голосов
/ 27 июня 2012

Ваш сервер работает с включенным SeLinux (принудительно)? Если это так, попробуйте запустить от имени пользователя root:

# setsebool -P httpd_can_network_connect on
4 голосов
/ 20 февраля 2012

У меня была проблема, что производственная версия работала просто отлично, а тестовая версия не смогла подключить PDO: / обе версии находятся на одних и тех же серверах, тестируйте в подкаталоге.

Исправление заменяло в DSN локальный хост для ip.

'mysql:host=localhost;dbname=db'

стал

'mysql:host=127.0.0.1;dbname=db'
4 голосов
/ 26 января 2010

Используя работающее соединение, запустите запрос:

show variables like 'socket';

(это ведет себя как оператор выбора) ... и вы получите путь к работающему сокету.

Затем проверьте права доступа к файлу.

4 голосов
/ 26 января 2010

Можете ли вы использовать 127.0.0.1 в качестве имени сервера вместо localhost?

IIRC, с некоторыми драйверами / адаптерами mySQL, определяет, используется ли сокет для установления соединения или нет.

2 голосов
/ 26 января 2010

try:

exec('`which mysql_config` --socket');

это должно показать настроенный сокет.

1 голос
/ 16 января 2014

Для чего это стоит, я нашел эту страницу после того же вопроса. Я нахожусь на сервере, на котором работает только Apache & PHP - MySQL установлен на другом компьютере. Я попробовал и DNS-имя сервера, и его IP-адрес и подтвердил, что могу пропинговать его. Приложение PHP на той же машине нормально общается с базой данных, используя старый синтаксис mysql_connect (). Но PDO из CLI выбрасывал эту ошибку.

Решением для меня было проверить мой DSN. Любая опечатка в самом DSN игнорируется, и PDO предполагает, что вы имеете в виду localhost . Моя проблема заключалась в том, что у меня было «name =» вместо «dbname =» в DSN.

1 голос
/ 07 января 2014

Я нашел причину странного поведения.Если bind-адрес отличается от 127.0.0.1 или 0.0.0.0 (все адреса), PDO не может подключиться к 127.0.0.1.

0 голосов
/ 12 июля 2015

Моя проблема может отличаться от ОП, но я подумал, что это стоит опубликовать. Я сделал обновление программного обеспечения на виртуальной машине, затем перезагрузил компьютер и получил сообщение об ошибке OP. Оказалось, что это проблема нехватки памяти, не позволяющая запустить mysql. Удаление нескольких больших файлов решило проблему.

...