2014-05-12 11 views
6

ho letto in manuale PDO che per chiudere il collegamento è necessario utilizzare il seguente:MySQL DOP Connection vicino - non impostata vs nulla

$connection = null; 

Tuttavia, alcune persone ha suggerito che a partire da PHP 5.3 ha un nuovo GC, il seguente dovrebbe essere utilizzato:

unset($connection); 

ho bisogno di sapere una volta per tutte, che si è preferito, o sono la stessa cosa?

+0

Perché pensi di volerlo? Hai qualche problema particolare al momento, causato da questo stesso dilemma? –

+0

Sì, troppe connessioni causano un basso rendimento del mio sistema. Prima di sottopormi all'intero ciclo ho bisogno di sapere come cambiarlo correttamente. –

+0

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

risposta

4

Fanno la stessa cosa. Disattivando l'handle $pdo e impostandolo su null, entrambi chiudono la connessione.

Puoi provarlo tu stesso. Esegui il seguente script in una finestra e in una seconda finestra apri il client MySQL ed esegui SHOW PROCESSLIST ogni due secondi per vedere quando la connessione scompare.

<?php 

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

Poi cambiare unset($pdo)-$pdo=null; ed eseguire nuovamente il test.

<?php 

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

L'extra sleep() alla fine è lì per dare un momento per vedere che la connessione è sceso, prima che lo script PHP termina (che cadrebbe comunque la connessione).

+0

L'unica differenza * piccola * che vedo è che 'unset()' distruggerà la variabile. Il che significa 'var_dump ($ pdo);' genererebbe un errore 'Variabile indefinita'. – HamZa

+1

@HamZa, grazie, è vero! Devo dire che fanno la stessa cosa * rispetto alla chiusura della connessione al database. * –

+1

Una risposta che risponde letteralmente all'OP, ma non risolve un singolo problema per l'OP. Lo chiamo "SO-way". –

-2

utilizzando

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

ma

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

in modo da utilizzare impostata è preferito.

-3

Basta non preoccuparsi di chiudere affatto. PHP lo chiuderà per te.

Si noti che, naturalmente, la propria applicazione deve essere progettata in modo adeguato, senza la necessità di ricollegarsi a database diversi a una velocità di mitragliatrice. E anche in quest'ultimo caso, il metodo che stai usando per chiudere sarebbe il problema minore. Stai abbaiando mai albero sbagliato. Lavora il numero di connessioni, non il modo in cui le stai chiudendo.

+1

Questo è totalmente falso e un pessimo consiglio. Alcuni script php sono di lunga esecuzione e devono recuperare alcuni dati da un db prima di avviare un'attività lunga e non si desidera mantenere aperto uno slot di connessione in sleep per niente. Deve esserci un modo corretto per chiudere + liberare QUALSIASI risorsa in PHP: true per rete, connessioni db, socket o qualsiasi altra cosa. Basandosi sul = null; l'assegnazione è molto sbagliata, IMHO. – Gabriel

2

Mi sono imbattuto in questo. Ho un oggetto PDO che si estende su setup e teardown, e non riesco a trovare dove ci deve essere un riferimento rimanente, poiché l'impostazione $ pdo su null non risolve il problema.

Le note allegate dall'utente in http://php.net/manual/en/pdo.connections.php discutono il problema della chiusura ritardata. Qui suggeriscono di eliminare la connessione corrente:

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

Questo è per postgres. Per mysql ho usato:

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