Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]PDO sprawdzanie czy połączenie aktywne
Forum PHP.pl > Forum > Przedszkole
Blackall
Witam,

posiadam pare skryptów wykonywanych cyklicznie lub 24h/dobę z poziomu ssh, napisane oczywiście w PHP.

Problem jest jednak taki, ze czasami zapytanie/łączenie z zewnętrzną stroną trwa długo i skrypt przerywa połączenie z bazą.

W jaki najprostszy sposób sprawdzić, czy obiekt klasy PDO jest cały czas połączony? mysql_ping zapewne tu nie zadziała?

W tej chwili mój skrypt wygląda mniej więcej tak:

Kod
$db = new PDO( )

while(true)
{
   // wykonywanie operacji
}


Może dobrym pomysłem byłoby inicjowanie $db w pętli? Wtedy jednak musiałbym to robić średnio 5 razy na sekundę w kilku skryptach, co nie wiem czy dobrze wpłynęłoby na wydajność.
wookieb
Spróbuj wysłać zapytanie np
  1. SELECT VERSION()

I jeżeli zwróci wyjątek (że brak połączenia), nawiąż je ponownie.
Blackall
w sumie nie głupie, aczkolwiek ostatnio bardzo zwracam uwagę na optymalizację bo jednak troche CPU te kilka procesów zabiera (wczoraj walczyłem i udało mi się z ok 20% CPU zrobić 6-7% dla wszystkich opadalonych na raz)

Nie ma możliwości wychwycenia w jakiś sposób zakończenia połączenia? Ale sprawdzanie czy jest ono aktywne bez wykonywania zapytania?
Crozin
Nie mam za bardzo czasu na testy więc sprawdź sobie:
  1. $pdo = new PDO(...);
  2.  
  3. var_dump($pdo->getAttribute(PDO::ATTR_SERVER_INFO));
  4. var_dump($pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS));
Blackall
Cytat(Crozin @ 6.12.2010, 17:30:30 ) *
Nie mam za bardzo czasu na testy więc sprawdź sobie:
  1. $pdo = new PDO(...);
  2.  
  3. var_dump($pdo->getAttribute(PDO::ATTR_SERVER_INFO));
  4. var_dump($pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS));

Kod
<?php
include('./Mysql.php');

echo PDO::ATTR_CONNECTION_STATUS;
?>


pomimo braku połączenia zwraca... 7
w przypadku nawiązania połączenia ($db = new Mysql()winksmiley.gif też zwraca 7 smile.gif

server_info to samo tylko szóstka
Crozin
Taa... pewnie dlatego, że stała PDO::ATTR_CONNECTION_STATUS ma wartość 7. Zauważyłeś, że ta stała jest podawana jako argument PDO::getAttribute()?
Blackall
Cytat(Crozin @ 6.12.2010, 22:15:51 ) *
Taa... pewnie dlatego, że stała PDO::ATTR_CONNECTION_STATUS ma wartość 7. Zauważyłeś, że ta stała jest podawana jako argument PDO::getAttribute()?

tak tylko ze getAttribute nie jest metodą statyczną, wiec nie moge jej wywołać nie mając obiektu.

A generalnie wlasnie o to chodzi ze jesli nie będzie połączony to (chyba?) obiekt nie będzie wtedy istniał i nie wykonam tej metody (wyrzuci błąd)

może w związku z tym po prostu sprawdzać czy obiekt istnieje? (o ile moje rozumowanie jest ok co do braku połączenia = braku obiektu)
Crozin
Oczywiście, że obiekt sam w sobie będzie istniał.
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.