2010-11-13 73 views
7

Tengo el siguiente código y actualicé esta página web en Firefox por 5 veces, luego el MySQL me mostró 5 conexiones. De acuerdo con el Manual de DOP,Cómo usar la conexión persistente de PDO?

conexiones persistentes no están cerradas al final de la secuencia de comandos, pero se almacenan en caché y volver a utilizar cuando otro script solicita una conexión utilizando las mismas credenciales . La caché de conexión persistente le permite evitar la sobrecarga de establecer una nueva conexión cada vez que una secuencia de comandos necesita hablar con una base de datos , lo que da como resultado una aplicación web más rápida .

He utilizado las mismas credenciales, pero el número de conexiones MYSQL sigue aumentando. Incluso al intentar cerrar la conexión con $db = null, no se pudieron cerrar las conexiones. ¿Qué pasa con mi código?

<?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

¿Qué "no funcionó"? cerrando la conexión o eliminando la persistencia? – stillstanding

+1

http://www.php.net/manual/en/pdo.connections.php Mira la última nota. ¿Esa puede ser la situación para ti? –

+0

¿Cuál es el método que ha aplicado para obtener el número de conexión? mostrar la lista de procesos o? – ajreal

Respuesta

1

Por lo que sé de conexión persistente es probable que no lo necesita:

  1. está en localhost por lo que la conexión es muy rápido y te vas a ahorrar mucho de almacenamiento en caché de su conexión
  2. debido al principal subyacente de Apache tiene muchos hilos que responden a la solicitud del cliente y debido a estos multi-threading la conexión es persistente en un solo hilo, no compartido en todos ellos, por lo que verá su número de conexión subir en mysql hasta que llegue al ThreadLimit de apache
  3. hay algunos riesgos que la persistencia de causa problema de conexión para su aplicación en el tipo de dblock o tableLock

Ahora usted puede ser que desee hacer un poco más investigación acerca de las conexiones persistentes si todavía piensa que realmente lo necesita

+1

Razones para la votación a la baja: no es relevante si alguien está en el host local o no. Las conexiones no persistentes pasan descriptores de archivos. Las conexiones no persistentes inician el saludo de conexión en cada solicitud HTTP. 2) Apache o nginx persisten la conexión por hilo y realizan el saludo una vez, lo que significa que cada solicitud posterior ** no ** tendrá que pasar por esta sobrecarga. Eso es lo que quieres**. La razón por la que las conexiones aumentan es porque Apache es una pieza de software mal escrita que no puede limpiarse correctamente. 3) WTF ?! Acabas de eliminar una declaración aleatoria con 0 hechos. – Mjh

+0

@Mjh gracias, al menos puedo entender por qué es downvoted, mientras que no pude sin comentarios –

+0

La respuesta puede ser mejorada y editada, en cuyo caso tendrá mi voto favorable, y le sugiero que agregue algunos bits adicionales de información lo. El problema es que nada es en blanco y negro, las conexiones persistentes tienen su uso, las no persistentes también. Las conexiones persistentes se usan mejor con 'php-fpm', mientras que las no persistentes se deben usar con Apache y' mod_php' porque Apache tiende a estropear de lo contrario. Las aplicaciones FastCGI como 'php-fpm' son rápidas (er) debido a las conexiones persistentes, no solo hacia MySQL. – Mjh

1

Esta pregunta es muy antigua, pero estará bien si contribuyo. Creo que se necesita para implementar una clase Singleton para el manejo de conexiones de base voy a escribir una clase de muestra a continuación ..

<?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 

?> 

Nuestra clase Singleton puede hacer sólo una conexión y volver a utilizarlo, vamos a ver cómo podemos utilizar nuestra clase

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

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

Entonces, ¿con qué contribuiste? Acabas de crear un singleton sin explicar por qué ni tocaste el tema de la conexión persistente. ¿Con qué ayuda tu código? ¿Sabes qué son las conexiones persistentes, por qué se usan y cómo ayuda Singleton con eso? – Mjh

+0

@Mjh ¿Me equivoco o rechazaste la respuesta incorrecta? –

+0

@Mjh Sé lo que es la conexión persistente, además de agregar soporte permanente a la clase, y más, conexión persistente y clase singleton, todo apunta a la escalabilidad, estamos aquí para ayudarnos mutuamente con lo mejor y lo que podría ayudar a otros, nuevamente , los códigos han sido explicados, eso es lo que comento los códigos, gracias – razzbee

0

Parece que debe cerrar el cursor y liberar (asignar nulo) al último objeto de la instrucción pdo y cerrar la conexión.

también, lo que es importante entender acerca de las conexiones persistentes es que persisten, pero no está garantizado que no sea:

  • se devolverá el último controlador de conexión en posteriores ejecuciones de script
  • ni ser reutilizando una conexión previa, si todavía está "ocupado". Ocupado puede significar en una secuencia de comandos, tiempo de espera, etc ... La instanciación de las conexiones puede seguir y seguir ... Ver Fully Understanding PDO ATTR_PERSISTENT
Cuestiones relacionadas