Проблема повторного подключения PHP mysqli

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

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

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

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

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

какие предложения?

6 ответов


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

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

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


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


вы не можете использовать постоянные соединения? Кроме того, это действительно необходимо для 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.воссоединитесь в моем.cng, который является конфигурацией mysql, а не php.ini, мне не удалось изменить переподключение через ini_set, но мой системный администратор сделал это в моем.cnf.

Итак, ТАД запутался, что другие сделали это в php.ini....