Po prostu dość proste pytanie dotyczące PDO w porównaniu z MySQLi.
Z MySQLi, aby zamknąć połączenie, możesz zrobić:
$this->connection->close();
Jednak w przypadku PDO stwierdza, że otwierasz połączenie za pomocą:
$this->connection = new PDO();
ale aby zamknąć połączenie, które ustawiłeś null
.
$this->connection = null;
Czy to prawda i czy to faktycznie zwolni połączenie PDO? (Wiem, że działa tak, jak jest ustawione null
.) Mam na myśli, że w przypadku MySQLi musisz wywołać funkcję ( close
), aby zamknąć połączenie. Czy PDO jest tak łatwe, jak = null
odłączenie? Czy jest funkcja zamykania połączenia?
Odpowiedzi:
Zgodnie z dokumentacją masz rację ( http://php.net/manual/en/pdo.connections.php ):
Zwróć uwagę, że jeśli zainicjujesz obiekt PDO jako trwałe połączenie, połączenie nie zostanie automatycznie zamknięte.
źródło
Note that if you initialise the PDO object as a persistent connection it will not automatically close the connection
Ale jeśli połączenie jest trwałe i jawnie wywołam na nim NULL przed zakończeniem skryptu, zostanie zamknięte, nawet jeśli jest trwałe, prawda?źródło
To więcej niż tylko ustawienie połączenia na null. Może tak jest w dokumentacji, ale to nie jest prawda w przypadku mysql. Połączenie pozostanie trochę dłużej (słyszałem lata 60-te, ale nigdy tego nie testowałem)
Jeśli chcesz tutaj znaleźć pełne wyjaśnienie, zobacz ten komentarz dotyczący połączeń https://www.php.net/manual/en/pdo.connections.php#114822
Aby wymusić zamknięcie połączenia, musisz zrobić coś takiego
źródło
Utworzyłem klasę pochodną, aby mieć bardziej samodokumentującą się instrukcję zamiast „$ conn = null;”.
Mogę więc zadzwonić pod mój kod między:
źródło
closeConnection
nie powinien być świadomy tego, że zamiast przypisywać obiekt musi skopiować odniesienie do zmiennej. Innymi słowy, próba kodowania bliskiej funkcji PDO ma złe skutki uboczne, przez co jest zawodna. Jedynym sposobem na zrobienie tego byłobycloseConnection
sprawdzenie, ile odwołań do obiektu PDO istnieje w kodzie i zgłoszenie, jeśli istnieje więcej niż 1.Pełny przykład z niestandardową klasą PDO2.
źródło