2009-09-23 19 views
11

Mam problemy z używaniem klasy mysqli w PHP i nie byłem w stanie znaleźć odpowiedzi w dowolnym miejscu.PHP mysqli reconnect problem

W moim skrypcie klasa tworzy połączenie mysqli, którego używa w swoich funkcjach. Potem ten skrypt się rozwidla. Połączenie jest również używane przez dzieci, ale mam problem z zamknięciem połączenia (serwer MYSQL przeminął) u rodzica, gdy dzieci umierają.

Zanim przełączyłem się na mysqli (korzystałem tylko z mysql) po prostu zadzwoniłem do mysql_ping, aby upewnić się, że połączenie db było tam przed wykonaniem zapytania w procesie nadrzędnym. Mysqli ma podobną funkcję pingowania, ALE w rzeczywistości nie łączy się ponownie, jeśli połączenie nie istnieje. Próbowałem używać globalnego ustawienia mysqli.reconnect = ON bez powodzenia (używając php.ini i ini_set).

Funkcja php mysql_connect pozwala na pobranie istniejącego połączenia, więc gdybym używał mysql zamiast mysqli, mógłbym po prostu ponownie użyć połączenia z dzieckiem zaraz po rozwidleniu procesu. ALE mysqli nie ma takiej funkcji ...

Jedyne, co mogłem zrobić, to zadzwonić do mysqli-> ping(), a jeśli to zwróciło fałsz, ponownie połączyć się z bazą danych w rodzica. Jest to bardzo nieefektywne i wolałbym raczej dowiedzieć się, jak zrobić to poprawnie z mysqli (i bez potrzeby ręcznego ponownego połączenia), które muszą się zmienić z powrotem na mysql ..

Jakieś sugestie?

Odpowiedz

13

Doc dla mysqli_ping() mówi, że jeśli ustawisz globalnej opcja mysqli.reconnect do 1 (w php.ini) następnie mysqli_ping() będzie ponownie gdy wykryje połączenie zniknął.

+3

To zadziałało. Nie zdawałem sobie sprawy, że nie można użyć ini_set do modyfikacji tej zmiennej, a będąc geniuszem, dodałem linię do php.ini wcześniej, nie wiedząc, że istnieje już linia mysli.reconnect = Off w dalszej części plik. Ale usunięcie tego i tylko używanie mysqli.reconnect działało i powodowało, że mysqli-> ping() działał jak mysql_ping. Dzięki za pomoc! –

0

u można spróbować coś innego .. zamiast ping .. spróbuj wysłać naprawdę proste zapytanie o niskiej intensywności, jak „Wybierz teraz () "i sprawdź, czy uzyskasz lepsze wyniki.

+0

powód, który może pomóc ... mysql widzi Ciebie jako aktywnego użytkownika, a nie kogoś, kto tylko utrzymuje połączenie i hogging zasobów .. wierzę, że są pewne ustawienia timeout w my.ini/my.cnf, które powodują to zachowanie .. jeśli masz dostęp do tego, możesz również zajrzeć do niego. –

0

Nie możesz użyć trwałych połączeń? Czy jest to naprawdę konieczne do fork()?

-2

Myślę, że musisz ustawić mysqli.reconnect w my.cng, która jest konfiguracją mysql, a nie php.ini, nie udało mi się zmienić ponownego połączenia poprzez ini_set, ale mój administrator sys zrobił to w moim. cnf.

Tak, odrobinę mylić, że inni zrobili go w php.ini ....

+0

Nieprawda. 'my.cnf' odnosi się tylko do serwera MySQL, więc zwykle nie ma wpływu na klienta PHP, a' mysqli' istnieje tylko w PHP. [mysqli.reconnect] (http://www.php.net/manual/ pl/mysqli.configuration.php # ini.mysqli.reconnect) * jest * ustawieniem konfiguracji 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 
}