Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Erläuterung der Schritte zum Implementieren des MySQL-Verbindungspooleffekts in PHP

Detaillierte Erläuterung der Schritte zum Implementieren des MySQL-Verbindungspooleffekts in PHP

php中世界最好的语言
Freigeben: 2023-03-26 21:36:02
Original
2995 Leute haben es durchsucht

Dieses Mal werde ich Ihnen die Schritte zum Implementieren des MySQL-Verbindungspooleffekts in PHP ausführlich erläutern. Was sind die Vorsichtsmaßnahmen für PHP, um den MySQL-Verbindungspooleffekt zu implementieren? Werfen wir einen Blick darauf.

Schleife, um Verbindungen aus dem MySQL-Verbindungspool abzurufen, ohne wiederholt neue Verbindungen zu erstellen.

Änderung der Referenzkonfiguration: Sie können sich auf den folgenden Artikel beziehen

Verhindern Sie, dass die Anzahl der Besuche zu groß wird und die Anzahl der Verbindungen überfüllt wird

<?php
/**
 * @author xuleyan
 * @title mysql类
 */
class DbHelper{
  //连接池
  private $_pools = [];
  //连接池大小
  const POOLSIZE = 5;
  const USERNAME = "root";
  const PASSWORD = "root";
  const HOST = "127.0.0.1";
  const DB = "test";
  public function construct()  
  {
    $db = self::DB;
    $username = self::USERNAME;
    $password = self::PASSWORD;
    $host = self::HOST;
    //持久化连接
    $presistent = array(PDO::ATTR_PERSISTENT => true);
    for ($i=0; $i < self::POOLSIZE; $i++) { 
      $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
      // sleep(3);
      array_push($this->_pools, $connection);
    }
  }
  //从数据库连接池中获取一个数据库链接资源
  public function getConnection()
  {
    echo 'get' . count($this->_pools) . "<br>";
    if (count($this->_pools) > 0) {
      $one = array_pop($this->_pools);
      echo 'getAfter' . count($this->_pools) . "<br>";
      return $one;
    } else {
      throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" );
    }
  }
  //将用完的数据库链接资源放回到数据库连接池
  public function release($conn)
  {
    echo 'release' . count($this->_pools) . "<br>";
    if (count($this->_pools) >= self::POOLSIZE) {
      throw new ErrorException ( "<mark>数据库连接池已满!</mark>" );
    } else {
      array_push($this->_pools, $conn);
      // $conn = null;
      echo 'releaseAfter' . count($this->_pools) . "<br>";
    }
  }
  public function query($sql)
  {
    try {
      $conn = $this->getConnection();
      $res = $conn->query($sql);
      $this->release($conn);
      return $res;
    } catch (ErrorException $e) {
      print 'error:' . $e->getMessage();
      die;
    }
  }
  public function queryAll($sql)
  {
    try {
      $conn = $this->getConnection();
      $sth = $conn->prepare($sql);
      $sth->execute();
      $result = $sth->fetchAll();
      return $result;
    } catch (PDOException $e) {
      print 'error:' . $e->getMessage();
      die;
    }
  }
}
Nach dem Login kopieren

Anruf

<?php 
require_once &#39;db.php&#39;;
$sql = &#39;select * from user&#39;;
$dbhelper = new DbHelper;
for ($i=0; $i < 10; $i++) { 
  $res = $dbhelper->query($sql);
  // var_dump($res) . PHP_EOL;
}
Nach dem Login kopieren
so in einer anderen Datei

So verwenden Sie den Verbindungspool von ThinkPHP, um eine Verbindung zu MySQL herzustellen

Aufgrund eines kleinen Fehlers hat das Projekt eine große Anzahl von Verbindungsanfragen an MySQL gesendet Eines Nachts und gleichzeitig gab es ein Problem mit dem DNS des MySQL-Servers, was zu einer Zeitüberschreitung der umgekehrten Lösung führte. Schließlich wurde der MySQL-Server zum Leben erweckt.

Endlich wurde der Fehler behoben und wir untersuchten, wie wir den MySQL-Verbindungspool vergrößern können.

Nachdem ich in den letzten zwei Tagen gesucht habe, habe ich festgestellt, dass es in der ThinkPHP-Dokumentation keine Dokumentation zum Verbindungspooling gibt. Also habe ich den Code selbst studiert.

Zuallererst: Es gibt drei häufig verwendete MySQL-Erweiterungsbibliotheken für PHP: mysql, mysqli, pdo_mysql.

* mysqli unterstützt kein Verbindungspooling.
* pdo_mysql wird unterstützt, die pdo-Erweiterung von thinkPHP unterstützt jedoch nicht mysql, sondern nur:'MSSQL','ORACLE','Ibase','OCI' (siehe Zeile 59 von Pdo.class.php)

* MySQL-Unterstützung über die Methode: mysql_pconnect (Spezifische Parameter finden Sie in der offiziellen PHP-Dokumentation)

1 So aktivieren Sie ThinkPHP, um lange Verbindungen zu ermöglichen:

class BaseMysql extends Model {
  protected $connection = array(
    'db_type' => 'mysql',
    'db_user' => '***',
    'db_pwd' => '*******',
    'db_host' => '*******',
    'db_port' => '3306',
    'db_name' => 'custom',
    'db_params' => array('persist' => true),
  );
}
Nach dem Login kopieren

Wenn Sie glauben, dass alles gut wird, wenn Sie dies konfigurieren, liegen Sie völlig falsch.

2 mysql -> my.cnf geänderte Konfiguration:
[mysqld]

interactive_timeout =60 // Ablaufzeit der interaktiven Verbindung (MySQL-Client).
wait_timeout =30 //Ablaufzeit einer langen Verbindung. Das muss geändert werden! Der Standardwert beträgt 8 Stunden. Wenn das Anforderungsvolumen groß ist, ist die Anzahl der Verbindungen bald erschöpft.
max_connections = 100 //Die maximale Anzahl von Verbindungen kann als Größe des Verbindungspools betrachtet werden

3 php.ini-Änderung:
[MySql]
mysql.allow_persistent = On
mysql.max_persistent = 99 // Muss kleiner sein als die maximale Anzahl von Verbindungen, die von mysql konfiguriert wurden
mysql.max_links = 99

4 Wenn der Webserver Apache ist, muss Keep-Alive aktiviert sein. Andernfalls kann die lange Verbindung nach Beendigung der Anforderung nicht wiederverwendet werden.
Webserver ist der Fall von Nginx:
pm = dynamisch // Standardmäßig einige Unterprozesse starten, um http-Anfragen zu verarbeiten.
pm.max_children // Maximale Anzahl untergeordneter Prozesse. Diese Konfiguration sollte kleiner sein als die max_connections von MySQL.

5 Wenn Sie feststellen, dass es immer noch nicht verwendet werden kann, überprüfen Sie bitte, ob das Keepalive des Betriebssystems aktiviert ist.

Übersicht:

Sie müssen gleichzeitig die Keep-Alive-Verbindung und die lange Datenbankverbindung aktivieren, da die lange Verbindung sonst die Anzahl der MySQL-Verbindungsressourcen vergeblich belegt und kann nicht wiederverwendet werden.
Im Fall von Nginx + PHP-FPM wird die lange Verbindung zwischen dem PHP-FPM-Unterprozess und MySQL tatsächlich aufrechterhalten. Welchem ​​PHP-FPM-Unterprozess die Front-End-HTTP-Anfrage zugewiesen ist, der Unterprozess wird seine lange Verbindung mit MySQL wiederverwenden.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erläuterung der Schritte zur Implementierung mehrerer linearer Regressionssimulationskurvenalgorithmen in PHP

Zugriff auf Array Elemente in doppelten Anführungszeichen in PHP Wie man mit Fehlerberichten umgeht

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Schritte zum Implementieren des MySQL-Verbindungspooleffekts in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage