2009-09-23 2 views
11

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

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

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

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

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

Любые предложения?

ответ

13

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

+3

Это сработало. Я не понимал, что вы не можете использовать ini_set для изменения этой переменной, и я являюсь гением, я добавил строку в php.ini раньше, не зная, что уже существует строка mysli.reconnect = Off дальше вниз файл. Но удаление этого и просто использование mysqli.reconnect работало и делало mysqli-> ping() так же, как mysql_ping. Спасибо за помощь! –

-1

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

+0

Переустановка PHP будет излишним. Найдите по умолчанию php.ini в сети и проверьте, насколько изменился ваш php.ini. – Phalgun

0

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

+0

причина, которая может помочь ... mysql видит вас как активного пользователя, а не того, кто просто держит соединение и забивает ресурсы. Я считаю, что в my.ini/my.cnf есть некоторые настройки таймаута, которые влияют на это поведение .. если у вас есть доступ к этому, вы также можете изучить его. –

0

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

-2

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

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

+0

Неправда. 'my.cnf' относится только к серверу MySQL, поэтому обычно не влияет на PHP-клиент, а' mysqli' существует только в PHP. [mysqli.reconnect] (http://www.php.net/manual/ ru/mysqli.configuration.php # ini.mysqli.reconnect) * является * настройкой конфигурации PHP. – Synchro

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