Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zerwane połączenie z MySQL
Forum PHP.pl > Forum > PHP
TomASS
Witajcie. Mam kod który się długo wykonuje (połączenie z zewnętrznym serwerem przez curl), po zakończeniu sprawdzam czy jest aktywne połączenie z bazą danych - jeśli nie to próbuję je nawiązać, oto kod:

  1. //dlugowykonujący się kod - ok 10sekund
  2.  
  3. if (!mysql_ping($conn)) {
  4. echo 'Ponawiam połączenie';
  5. echo '<br/>======================<br/>';
  6. if(mysql_connect ("$dbhost","$dblogin","$dbhaslo")) echo 'POLACZONO!';
  7. else echo 'NIEPOLACZONO';
  8. echo '<br/>======================<br/>';
  9. mysql_select_db ("$db");
  10. }
  11. else echo 'Połączenie aktywne';
  12.  
  13. $query = "UPDATE .....";
  14. $result = mysql_query($query);


Niestety jedyne co wyświetla to:
Cytat
Ponawiam połączenie
MySQL server has gone away (na zapytaniu UPDATE)

nie wyświetla nawet POLACZONO/NIEPOLACZONO :/

na bank coś robię źle - tylko nie wiem co :/
Fifi209
Po 1. Po co ten mysql_ping?
Po 2. Co to za wybryki:
  1. mysql_connect ("$dbhost","$dblogin","$dbhaslo")) echo 'POLACZONO!';


CO TO JEST?
Quadina
Polecenie mysql_ping samo w sobie już łączy się ponownie w przypadku zerwania połączenia. Jeżeli jeszcze ponad to będziesz chciał wykonać kolejne połączenie (co próbujesz zrobić) to zwróci ona dodatkowy resource. Funkcja mysql_query łączy się domyślnie do pierwszego połączenia. Zatem Twój UPDATE będzie się odwoływać do starego połączenia, mimo, że nastąpi już nowe. Jak dla mnie kod powinien wyglądać następująco.

  1. if($conn = mysql_connect ($dbhost,$dblogin,$dbhaslo)){
  2. echo 'POLACZONO!';
  3. } else {
  4. echo 'NIEPOLACZONO';
  5. die();
  6. }
  7. echo '<br/>======================<br/>';
  8. mysql_select_db ($db, $conn);
  9.  
  10. if (!mysql_ping($conn)) {
  11. echo 'Ponawilem połączenie';
  12. echo '<br/>======================<br/>';
  13. }
  14. else echo 'Połączenie aktywne';
  15.  
  16. $query = "UPDATE .....";
  17. $result = mysql_query($query, $conn);


Po za tym 10 sekundowe wykonanie skryptu nie rozłączy Ci połączenia z bazą. Wierz mi, że nawet po 5 minutach połączenie wciąż będzie trwać ;-)
TomASS
@Quadina:

Wiem, że ponawia (manual tak twierdzi). Jednak coś jest nie tak, dałem już wcześniej tak jak napisałeś:
Zwraca mi:
Cytat
POLACZONO!
>Polaczenie cURL trwało 12s<
Ponawilem połączenie
======================
>zapytanie UPDATE<
MySQL server has gone away


Cytat
Po za tym 10 sekundowe wykonanie skryptu nie rozłączy Ci połączenia z bazą. Wierz mi, że nawet po 5 minutach połączenie wciąż będzie trwać ;-)

Wiem, że nie powinno - to jednak rozłącza - niewiedząc czemu. Może dlatego, że w międzyczasie przełączam się pomiędzy bazami (mysql_select_db)
PawelC
jak przełączasz się między bazami, to jak chcesz mieć stałe połączenie? No chyba, że każde połączenie definiujesz osobno.
pyro
Cytat(ExPlOiT @ 4.12.2010, 09:38:29 ) *
jak przełączasz się między bazami, to jak chcesz mieć stałe połączenie? No chyba, że każde połączenie definiujesz osobno.


A co ma przełączanie się między bazami do stałego połączenia? Przełączać bazy można sobie do woli w jednym połączeniu.

Warto po każdej instrukcji PHP sprawdzać status połączenia za pomocą mysql_ping() i sprawdzać co zrywa połączenie.
PawelC
U mnie wszystko ok, sprawdzałem połącznie z bazą która stoi na VPS, nie zrywa połączenia, ani nic, a więc to u Ciebie coś jest nie tak.

Nasuwa mi się pytanie, czy serwer z którym chcesz się połączyć, zezwala na połączenia z bazą, z zewnątrz?

Sorki za wprowadzanie w błąd sad.gif
Quadina
Ja również z ciekawości uruchomiłem skrypt u siebie łączący się do drugiego przez cURL na odpowiednio 5,10,30,60 i 120 sekund. Za każdym razem połączenie z bazą polecenie mysql_ping() przywracało poprawnie (jak go nie było to powyżej 30 sekund połączenia faktycznie nie było). Pogrzebie dzisiaj coś z tym tematem jeszcze, bo interesujące to jest dla mnie bardzo. Podaj mi tylko gdzie masz hosting, czy to jest dedyk i jeżeli tak to w jakiej mniej więcej konfiguracji stoi wszystko.
TomASS
Cytat
jak przełączasz się między bazami, to jak chcesz mieć stałe połączenie?

nie ma to znaczenia
Cytat
U mnie wszystko ok, sprawdzałem połącznie z bazą która stoi na VPS, nie zrywa połączenia, ani nic, a więc to u Ciebie coś jest nie tak.

wiem, że u mnie, dlatego ja piszę że mam problem a nie Ty winksmiley.jpg
Cytat
Nasuwa mi się pytanie, czy serwer z którym chcesz się połączyć, zezwala na połączenia z bazą, z zewnątrz?

Bez problemu zwraca mi informacje.
Cytat
Ja również z ciekawości uruchomiłem skrypt u siebie łączący się do drugiego przez cURL na odpowiednio 5,10,30,60 i 120 sekund.

Dzięki, jak już wcześniej ustaliliśmy to nie okres bezczynności zrywa połączenie tylko coś innego :/
Cytat
Podaj mi tylko gdzie masz hosting, czy to jest dedyk i jeżeli tak to w jakiej mniej więcej konfiguracji stoi wszystko.

Mój własny serwer
Cytat
Warto po każdej instrukcji PHP sprawdzać status połączenia za pomocą mysql_ping() i sprawdzać co zrywa połączenie.

To jest myśl, tak zrobię i zobaczę w jakim miejscu się wysypuje, dam znać.
Quadina
Cytat(TomASS @ 4.12.2010, 14:51:38 ) *
Mój własny serwer


Sprawdź zatem ustawienia w /etc/my.cnf, ja mam ustawione 60 sekund, więc po 60 sekundach mi poprawnie zrywa połączenie ;-)

[mysqld]
wait_timeout = 1800
connect_timeout = 60
TomASS
Już mam troszkę więcej informacji, dla celów testowych mam taki kod:

  1. if (!mysql_ping($conn)) echo '<br/>7c Próba ponowienia połączenia';
  2. else echo '<br/>7c Nie ponawiano połączenia';
  3.  
  4. $page = curl_exec($c);
  5.  
  6. if (!mysql_ping($conn)) echo '<br/>7d Próba ponowienia połączenia';
  7. else echo '<br/>7d Nie ponawiano połączenia';
  8.  
  9. if (!mysql_ping($conn)) echo '<br/>8 Próba ponowienia połączenia';
  10. else echo '<br/>8 Nie ponawiano połączenia';
  11.  
  12. if (!mysql_ping($conn)) echo '<br/>8a Próba ponowienia połączenia';
  13. else echo '<br/>8a Nie ponawiano połączenia';

Wyskakuje:

Cytat
7c Nie ponawiano połączenia
7d Próba ponowienia połączenia
8 Próba ponowienia połączenia
8a Próba ponowienia połączenia

Czyli - zrywa połączenie na curl_exce oraz później nie może ponowić..... wyskakuje ciągle "Próba ponowienia połączenia" sad.gif
Quadina
To może zakończ połączenie przed cURL i wywołaj je ponownie po cURL ? Będzie najprościej chyba ;-) Bo jakoś nie specjalnie widzę obecnie inne rozwiązanie Twojego problemu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.