2010-11-13 5 views
7

Ho il seguente codice e ho aggiornato questa pagina Web in Firefox per 5 volte, quindi MySQL mi ha mostrato 5 connessioni. Secondo il manuale DOP,Come utilizzare la connessione persistente di PDO?

connessioni permanenti non vengono chiuse alla fine dello script, ma sono memorizzati nella cache e riutilizzati quando un altro script richiede una connessione utilizzando le stesse credenziali di . La connessione permanente della cache consente di evitare l'overhead di stabilire una nuova connessione ogni tempo che uno script deve comunicare con un database , risultando in un'applicazione Web più veloce .

Ho utilizzato le stesse credenziali, ma il numero di connessioni MYSQL continua ad aumentare. Anche il tentativo di chiudere la connessione con $db = null non può chiudere le connessioni. Cosa c'è di sbagliato nel mio codice?

<?php 
try { 
$dbh = new PDO('mysql:host=127.0.0.1;dbname=lingtong', 'root', 'xxxxxx', array(PDO::ATTR_PERSISTENT => true)); 
foreach ($dbh->query('SELECT * from agent') as $row) 
    print_r($row); 
$dbh = null; 
} catch (PDOException $e) { 
print "Error! : " . $e->getMessage() . "<br/>"; 
die(); 
} 
+1

Cosa "non ha funzionato"? chiusura della connessione o rimozione della persistenza? – stillstanding

+1

http://www.php.net/manual/en/pdo.connections.php Guarda l'ultima nota. Questa può essere la situazione per te? –

+0

qual è il metodo applicato per ottenere il numero di connessione? mostra la lista dei processi o? – ajreal

risposta

1

Da quello che so da connessione persistente probabilmente non ne ha bisogno:

  1. siete su localhost in modo che il collegamento è molto veloce e voi non risparmiare un sacco di caching della connessione
  2. a causa del principio sottostante di Apache hai molti thread che rispondono alla richiesta del client e, a causa di questi multi-threading, la connessione è persistente in un singolo thread, non condivisa su tutti, quindi vedrai il tuo numero di connessione salire in mysql fino a raggiungere il limite di thread di apache
  3. c'è qualche rischio che persistente problema di connessione causa alla tua app nel tipo di DBLock o tableLock

Ora si potrebbe desiderare di fare un po 'più ricerca su connessioni persistenti, se si pensa ancora che si ha realmente bisogno

+1

Motivi per downvote: non è rilevante se qualcuno è su localhost o meno. Le connessioni non persistenti trascorrono i descrittori di file. Le connessioni non persistenti avviano l'handshake di connessione su ogni richiesta http. 2) Apache o nginx mantengono la connessione per thread e eseguono l'handshake una volta - ciò significa che tutte le richieste successive ** non dovranno passare attraverso questo overhead. Questo è ciò che vuoi**. Il motivo per cui le connessioni aumentano è perché Apache è un software scritto in modo molto mal scritto che non può essere pulito correttamente. 3) WTF ?! Hai appena rilasciato una dichiarazione casuale con 0 fatti. – Mjh

+0

@Mjh grazie, almeno posso capire perché è downvoted, mentre non ho potuto senza commento –

+0

La risposta può essere migliorata e modificata, nel qual caso avrò il mio upvote, e ti suggerisco di aggiungere qualche bit in più di informazioni ad esso. Il problema è che nulla è in bianco e nero, le connessioni persistenti hanno il loro uso, anche quelle non persistenti. Le connessioni persistenti sono meglio usate con 'php-fpm', mentre non-persistent dovrebbe essere usato con Apache e' mod_php' perché Apache tende a rovinare altrimenti. Le applicazioni FastCGI come 'php-fpm' sono veloci (er) a causa delle connessioni persistenti, non solo verso MySQL. – Mjh

1

Questa domanda è molto vecchia ma andrà bene se contribuisco. Penso che è necessario implementare una classe Singleton per la gestione delle connessioni al database scriverò una classe di esempio seguente ..

<?php 
class DB{ 

//set the connection property to private to prevent direct access 
private static $conn; 

//now since we dont want to reinstiate the class anytime we need it, lets also set the constructor to private 
private function __construct(){} 

//now lets create our method for connecting to the database 
public static function connect(){ 

//now lets check if a connection exists already in our $conn property, then we should return it instead of recreating a new connection 
if(!empty(self::$conn)){ 
return self::$conn; 
}//end if 

//upon reaching here means the $conn property is empty so lets create a new connection 

try { 
$dbh = new PDO('mysql:host=127.0.0.1;dbname=lingtong', 'root', 'xxxxxx', array(PDO::ATTR_PERSISTENT => true)); 

//lets now assign the database connection to our $conn property 
self::$conn = $dbh; 

//return the connection 
return $dbh; 

} catch (PDOException $e) { 
print "Error! : " . $e->getMessage() . "<br/>"; 
die(); 
} 

}//end method 

}//end class 

?> 

La nostra classe Singleton può fare una sola connessione e riutilizzarlo, dobbiamo vedere come possiamo usare la nostra classe

<?php 
$dbh = DB::connect(); 

foreach ($dbh->query('SELECT * from agent') as $row){ 
    print_r($row); 
} 
?> 
+0

Allora, con cosa hai contribuito? Hai appena creato un singleton senza spiegare perché né hai toccato il tema della connessione persistente. A cosa serve il tuo codice? Sai quali sono le connessioni persistenti, perché vengono utilizzate e come aiuta Singleton? – Mjh

+0

@ Mjh Sono sbagliato o hai downvoted la risposta sbagliata? –

+0

@Mjh So qual è la connessione persistente, inoltre ho aggiunto il supporto persistente alla classe, e più, la connessione persistente e la classe singleton puntano tutti alla scalabilità, siamo qui per aiutarci a vicenda con cosa è meglio e cosa potrebbe aiutare gli altri, ancora , i codici sono stati spiegati, questo ho commentato i codici, grazie – razzbee

0

Sembra che sia necessario chiudere il cursore e rilasciare (assegnare null) all'ultimo oggetto istruzione pdo e chiudere la connessione.

Inoltre, ciò che è importante da capire su connessioni persistenti è che essi persistono, ma non si è garantito che si nè:

  • da dare indietro il vostro gestore Ultimo collegamento in ulteriori esecuzioni di script
  • Né essere riutilizzare una connessione precedente, se è ancora "occupato". Occupato può significare in una sceneggiatura, scadenze ecc ... L'instanciazione delle connessioni può andare avanti e avanti ... Vedi Fully Understanding PDO ATTR_PERSISTENT