Przeczytaj tę odpowiedź poniżej , która szczegółowo opisuje sposoby złagodzenia opisanych tutaj problemów.
Przy użyciu PDO występują te same wady, co w przypadku każdego innego interfejsu bazy danych PHP, który wykonuje trwałe połączenia: jeśli skrypt nieoczekiwanie zakończy się w trakcie operacji na bazie danych, następne żądanie, które spowoduje przerwanie połączenia, odbierze miejsce, w którym przerwany został martwy skrypt. Połączenie jest utrzymywane otwarte na poziomie menedżera procesów (Apache dla mod_php, bieżący proces FastCGI, jeśli używasz FastCGI itp.), A nie na poziomie PHP, a PHP nie mówi procesowi nadrzędnemu, aby pozwolił umrzeć połączeniu, gdy skrypt kończy się nienormalnie.
Jeśli martwe skrypty zablokowały tabele, tabele te pozostaną zablokowane, dopóki połączenie nie zostanie przerwane lub następny skrypt, który uzyska połączenie, odblokuje same tabele.
Jeśli martwy skrypt znajdował się w środku transakcji, może blokować wiele tabel, dopóki nie uruchomi się licznik zakleszczenia, a nawet wtedy zegar zakleszczenia może zabić nowsze żądanie zamiast starszego żądania, które powoduje problem.
Jeśli martwy skrypt znajdował się w środku transakcji, następny skrypt, który pobierze to połączenie, również otrzyma stan transakcji. Jest bardzo możliwe (w zależności od projektu aplikacji), że następny skrypt może nigdy nie próbować zatwierdzić istniejącej transakcji, lub zatwierdzi, gdy nie powinien, lub wycofa się, gdy nie powinien.
To tylko wierzchołek góry lodowej. Można to wszystko złagodzić do pewnego stopnia, zawsze próbując wyczyścić po brudnym połączeniu przy każdym żądaniu skryptu, ale może to być uciążliwe w zależności od bazy danych. Chyba, że zidentyfikowali tworzenia połączeń bazie danych jako jedna rzecz, która jest wąskim gardłem w skrypcie (oznacza to zrobiłeś kod profilowania za pomocą Xdebug i / lub xhprof ), należy nie rozważyć stałe połączenia w postaci roztworu do niczego.
Co więcej, większość współczesnych baz danych (w tym PostgreSQL) ma swoje preferowane sposoby wykonywania pul połączeń, które nie mają bezpośrednich wad, jak zwykłe trwałe połączenia oparte na PHP.
Aby wyjaśnić tę kwestię, używamy trwałych połączeń w moim miejscu pracy, ale nie z wyboru. Napotkaliśmy dziwne zachowanie połączenia, gdy początkowe połączenie z naszego serwera aplikacji do naszego serwera bazy danych trwało dokładnie trzy sekundy, kiedy powinno to zająć ułamek sekundy. Uważamy, że to błąd jądra. Zrezygnowaliśmy z próby rozwiązania tego problemu, ponieważ zdarzyło się to losowo i nie można go było odtworzyć na żądanie, a nasze outsourcingowe informatyki nie miały konkretnej możliwości wyśledzenia.
Niezależnie od tego, kiedy ludzie w magazynie przetwarzają kilkaset przychodzących części, a każda część zajmuje trzy i pół sekundy zamiast pół sekundy, musieliśmy podjąć działania, zanim nas porwali i zmusili do pomocy. Więc włączyliśmy kilka bitów w naszą domową potworność ERP / CRM / CMS i doświadczyliśmy wszystkich okropności trwałych połączeń z pierwszej ręki. Wyszukanie wszystkich subtelnych drobnych problemów i dziwnych zachowań, które wydawały się przypadkowe, zajęło nam tygodnie . Okazało się, że te fatalne błędy raz w tygodniu, które pilnie wycisnęli nasi użytkownicy z naszej aplikacji, pozostawiały zablokowane tabele, porzucone transakcje i inne niefortunne kłopotliwe stany.
Ta szlochająca historia ma sens: zepsuła rzeczy, których nigdy się nie spodziewaliśmy, wszystko w imię występu. Kompromis nie był tego warty iz niecierpliwością czekamy na dzień, w którym możemy wrócić do normalnych połączeń bez zamieszek ze strony naszych użytkowników.