2009-06-25 5 views
61

Quando apro una connessione MySQL in PHP con solo funzioni di MySQL predefinite di PHP, faccio la seguente:connessioni Fare SQL aperti con DOP in PHP devono essere chiusi

$link = mysql_connect($servername, $username, $password); 
mysql_select_db($dbname); 
//queries etcetera 
mysql_close($link); 

Quando apro un collegamento con DOP, sembra che questo:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); 
//prepare statements, perform queries 

devo chiudere esplicitamente la connessione come faccio con mysql_connect() e mysql_close()? In caso contrario, come fa PHP a sapere quando ho finito la mia connessione?

TIA.

risposta

76

Utilizzare $link = null per consentire a PDO di sapere che può chiudere la connessione.

PHP: PDO Connections & Connection Management

alla connessione con il database, un'istanza della classe DOP viene restituito allo script. La connessione rimane attiva per la durata di tale oggetto PDO. Per chiudere la connessione, devi distruggere l'oggetto assicurandoti che tutti i rimanenti riferimenti ad esso siano cancellati: lo fai assegnando NULL alla variabile che contiene l'oggetto. Se non lo fai esplicitamente, PHP chiuderà automaticamente la connessione al termine dello script.

+1

Grazie! Molto apprezzato. – benjy

+1

Mi chiedo se PDO dtor chiuda esplicitamente la connessione o la lasci a PHP proprio come succede quando 'mysql_close()' non è usato alla fine dello script (o nel '__destruct()' della tua classe db) ? Dal manuale suona come quando l'oggetto PDO viene distrutto, anche la connessione viene chiusa. Importante a causa di questo: http://stackoverflow.com/a/2960656/372654. Sembra così dal codice sorgente PDO ma ... –

+5

Non è possibile "disinserire()" l'oggetto PDO invece di impostarlo su NULL? Voglio davvero qualche chiarimento su questo! –

11

Quando lo script PHP termina l'esecuzione, tutte le connessioni sono chiuse. Inoltre, non è necessario chiudere esplicitamente la connessione con mysql_close().

0

http://uk3.php.net/pdo

Da quanto ho capito non ho potuto vedere comunque per chiuderla nel manuale php, ed esempi di script ho guardato subito a mai chiuso la connessione in alcun modo da quello che ho potuto vedere.

5

È inoltre possibile limitare le connessioni alle funzioni locali. In questo modo la connessione viene chiusa non appena la funzione è completata.

11

PDO non offre tale funzione da solo. Le connessioni via PDO sono gestite indirettamente tramite il conteggio degli oggetti PDO in PHP.

Ma a volte si desidera chiudere comunque la connessione, indipendentemente dal numero di account. O perché non puoi controllarlo, ne hai bisogno per scopi di test o simili.

È possibile chiudere il collegamentoMySQL con DOP eseguendo una query SQL.Ogni utente che è in grado di connettersi al server MySQL è in grado di KILL almeno il suo proprio thread:

/* 
* Close Mysql Connection (PDO) 
*/ 

$pdo_mysql_close = function (PDO $connection) { 

    $query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1); 
    $list = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC); 
    foreach ($list as $thread) { 
     if ($thread['Info'] === $query) { 
      return $connection->query('KILL ' . $thread['Id']); 
     } 
    } 
    return false; 
}; 

$pdo_mysql_close($conn); 

Mysql correlati Documentazione:

correlati StackOverflow Domande:

.210
1

Beh visto che il $link per la DOP è assegnato un oggetto, PHP sarebbe impostare che come nullo, non appena lo script viene eseguito in modo tale che non è più un oggetto. Quindi basta:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); 

//prepare statements, perform queries 

$link = null;