Вопрос

У меня возникли проблемы с использованием класса mysqli в PHP, и я нигде не смог найти ответ.

В моем скрипте класс создает соединение mysqli, которое он использует во всех своих функциях.После этого этот скрипт разветвляется.Соединение также используется дочерними элементами, но я сталкиваюсь с проблемой закрытия соединения (сервер MYSQL ушел) в родительском, когда дочерние элементы умирают.

До того, как я переключился на mysqli (просто использовал mysql) Я просто вызвал mysql_ping, чтобы убедиться, что соединение с БД было перед выполнением запроса в родительском процессе.Mysqli имеет аналогичную функцию ping, НО на самом деле она не переподключается, если соединение пропало.Я попытался использовать глобальную настройку mysqli.reconnect=ON, но безуспешно (используя php.ini и ini_set).

Функция php mysql_connect позволяет вам перехватывать уже существующее соединение, поэтому, если бы я использовал mysql вместо mysqli, я мог бы просто повторно использовать соединение в дочернем элементе сразу после разветвления процесса.НО mysqli, похоже, не обладает какой-либо такой функциональностью...

Единственное, что я смог сделать, это вызвать mysqli->ping() и, если это вернуло значение false, повторно подключиться к родительской базе данных.Это ужасно неэффективно, и я бы предпочел выяснить, как сделать это правильно с помощью mysqli (и нет необходимости в ручных переподключениях), которые должны быть изменены обратно на mysql..

Есть какие-нибудь предложения?

Это было полезно?

Решение

Документ для mysqli_ping() говорит, что если вы установите глобальную опцию mysqli.переподключитесь к 1 (в вашем php.ini), затем mysqli_ping() повторно подключится, когда обнаружит, что соединение прервано.

Обновить:С тех пор как я ответил на этот вопрос в 2009 году, PHP в основном перешел к использованию mysqlnd драйвер по умолчанию вместо libmysql.Как упоминалось в комментарии ниже, mysqlnd не поддерживает mysqli_ping() функция, и разработчики PHP сделали это намеренно, согласно их ответу "Не исправит" в https://bugs.php.net/bug.php?id=52561

Таким образом, похоже, что решения для автоматического повторного подключения в PHP больше не существует.

Другие советы

вы можете попробовать что - то немного другое ..вместо пинга ..попробуйте отправить действительно простой запрос низкой интенсивности, например "выберите сейчас ()", и посмотрите, получите ли вы лучшие результаты.

Разве вы не можете использовать постоянные соединения?Кроме того, действительно ли это необходимо для fork() ?

function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}

Использование http://www.php.net/manual/en/mysqli.real-connect.php ...переустановите php и проверьте настройки php.ini

Я думаю, вам нужно установить mysqli.reconnect в my.cng, который является конфигурацией mysql, а не php.ini, мне не удалось изменить reconnect через ini_set, но мой системный администратор сделал это в my.cnf.

Итак, немного смущен тем, что другие сделали это в php.ini....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top