9 Stimmen

Wie verwendet man die persistente Verbindung von PDO?

Ich habe den folgenden Code und frischte diese Webseite in Firefox für 5 mal, dann die MySQL zeigte mir 5 Verbindungen. Laut dem PDO-Handbuch,

Dauerhafte Verbindungen werden nicht geschlossen am Ende des Skripts geschlossen, sondern werden zwischengespeichert und wiederverwendet, wenn ein anderes Skript eine Verbindung mit denselben Anmeldeinformationen anfordert. Der persistente Verbindungs Cache ermöglicht es Ihnen, den Overhead zu vermeiden der Aufbau einer neuen Verbindung bei jedem wenn ein Skript mit einer Datenbank kommunizieren Datenbank, was zu einer schnelleren Webanwendung Anwendung.

Ich habe dieselben Anmeldedaten verwendet, aber die Anzahl der MYSQL-Verbindungen steigt ständig. Selbst wenn ich versuche, die Verbindung mit $db = null konnte die Verbindungen nicht schließen. Was ist an meinem Code falsch?

<?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();
}

3voto

Big Zak Punkte 880

Diese Frage ist schon sehr alt, aber es ist in Ordnung, wenn ich etwas dazu beitrage. Ich denke, Sie müssen eine Singleton-Klasse für die Behandlung von Datenbank-Verbindungen implementieren, ich werde eine Beispielklasse unten schreiben.

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

?>

Unsere Singleton-Klasse kann nur eine einzige Verbindung herstellen und wiederverwenden, mal sehen, wie wir unsere Klasse verwenden können

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

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

1voto

Sebas Punkte 20444

Es scheint, dass Sie den Cursor schließen und das letzte pdo-Anweisungsobjekt freigeben (null zuweisen) müssen, um die Verbindung zu schließen.

Außerdem ist es wichtig zu verstehen, dass persistente Verbindungen bestehen bleiben, aber es ist nicht garantiert, dass sie auch bestehen bleiben:

  • Bei weiteren Skriptausführungen erhalten Sie Ihren letzten Verbindungshandler zurück
  • Sie können auch nicht eine frühere Verbindung wiederverwenden, wenn diese noch "besetzt" ist. Besetzt kann bedeuten, dass ein Skript läuft, die Zeit abgelaufen ist usw... Die Instanziierung von Verbindungen kann immer weitergehen... Siehe Vollständiges Verständnis von PDO ATTR_PERSISTENT

-1voto

Jonatan Cloutier Punkte 879

Nach dem, was ich von einer dauerhaften Verbindung weiß, brauchen Sie es wahrscheinlich nicht:

  1. Sie befinden sich auf localhost, so dass die Verbindung sehr schnell ist und Sie durch das Caching Ihrer Verbindung nicht viel sparen werden
  2. wegen des zugrundeliegenden Prinzips von Apache haben Sie viele Threads, die die Client-Anfrage beantworten, und wegen dieser Multi-Threading die Verbindung ist in einem einzigen Thread persistent, nicht auf alle von ihnen geteilt, so sehen Sie Ihre Anzahl der Verbindung in mysql gehen, bis es die ThreadLimit von Apache erreichen
  3. Es besteht ein gewisses Risiko, dass eine dauerhafte Verbindung in Form eines dbLock oder tableLock Probleme mit Ihrer Anwendung verursacht.

Wenn Sie immer noch der Meinung sind, dass Sie persistente Verbindungen wirklich brauchen, sollten Sie sich ein wenig mehr informieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X