2014-05-12 8 views
6

Czytałem w instrukcji PDO że zamknięcie połączenia należy użyć następujących:PDO MySQL Connection blisko - rozbrojony vs zerową

$connection = null; 

Jednak niektórzy ludzie sugerują, że od PHP 5.3 ma nowy GC, należy użyć:

unset($connection); 

Muszę wiedzieć raz na zawsze, który z nich jest preferowany, czy jest taki sam?

+0

Dlaczego myślisz, że chcesz? Czy napotkasz obecnie jakiś szczególny problem spowodowany tym dylematem? –

+0

Tak, zbyt wiele połączeń powoduje, że mój system ma niską wydajność. Zanim przejdę przez wszystkie moje pętle, muszę wiedzieć, jak to zmienić poprawnie. –

+0

[Related ...] (http: // stackoverflow.com/questions/15444748/is-it-needed-to-close-pdo-connections) – HamZa

Odpowiedz

4

Robią to samo. Wyłączenie uchwytu $pdo i ustawienie go na zero powoduje zamknięcie połączenia.

Możesz to przetestować samodzielnie. Uruchom następujący skrypt w jednym oknie, a w drugim oknie otwórz klienta MySQL i co kilka sekund uruchom SHOW PROCESSLIST, aby zobaczyć, kiedy połączenie zniknie.

<?php 

$pdo = new PDO(..); 
sleep(10); 
unset($pdo); 
echo "pdo unset!\n"; 
sleep(10); 

Następnie zmień unset($pdo) do $pdo=null; i ponownie uruchomić test.

<?php 

$pdo = new PDO(..); 
sleep(10); 
$pdo = null; 
echo "pdo set null!\n"; 
sleep(10); 

Dodatkowy sleep() w końcu jest tam dać chwilę, aby zobaczyć, że połączenie spadła, zanim skrypt PHP kończy (co spadnie połączenie w każdym razie).

+0

Jedyną * małą * różnicą, którą widzę, jest to, że 'unset()' zniszczy zmienną. Co oznacza, że ​​'var_dump ($ pdo);' spowodowałby błąd 'Niezdefiniowana zmienna'. – HamZa

+1

@HamZa, dzięki, to prawda! Powinienem powiedzieć, że robią to samo * w odniesieniu do zamykania połączenia z bazą danych. * –

+1

Odpowiedź, która dosłownie odpowiada na PO, ale nie rozwiązuje pojedynczego problemu dla PO. Nazywam to "SO-way". –

-2

użyciu

$pdo = null; //is an assignment to null; the variable still declared in the memory. 

ale

unset($pdo); // will call the function to distroy also the adress "@" pointed by the variable. 

więc korzystanie wyłączony jest preferowana.

-3

Po prostu nie przejmuj się zamykaniem. PHP zamknie to dla Ciebie.

Należy pamiętać, że aplikacja musi być oczywiście zaprojektowana w sposób przyjazny dla środowiska, bez konieczności ponownego łączenia z różnymi bazami danych z szybkością karabinu maszynowego. A nawet w drugim przypadku metoda, której używasz do zamknięcia, byłaby najmniejszym problemem. Szczekasz najgorsze drzewo w historii. Przetwarzaj liczbę połączeń, a nie sposób ich zamykania.

+1

To jest całkowicie nieprawdziwe i bardzo zła rada. Niektóre skrypty php są długotrwałe i muszą pobierać niektóre dane z db przed uruchomieniem długiego zadania, a nie chcesz, aby jedno gniazdo połączenia było otwarte w stanie uśpienia za nic. MUSI to być właściwy sposób na zamknięcie + dowolnego DOWOLNEGO zasobu w PHP: prawda dla sieci, połączeń db, gniazd lub cokolwiek innego. Opierając się na = null; zadanie jest bardzo złe, IMHO. – Gabriel

2

Natknąłem się na to. Mam obiekt PDO, który obejmuje konfigurację i przestój, i nie mogę znaleźć miejsca, w którym musi pozostać referencja, ponieważ ustawienie $ pdo na wartość null nie rozwiązało problemu.

Wpisane przez użytkownika uwagi w http://php.net/manual/en/pdo.connections.php omawia problem opóźnionego zamknięcia. Tutaj sugerują zabicie bieżącego połączenia:

$ pdo-> query ('SELECT pg_terminate_backend (pg_backend_pid());'); $ pdo = null;

To jest dla postgres. Dla mysql użyłem:

$ pdo-> query ('KILL CONNECTION CONNECTION_ID();');