Persistente Verbindungen funktionieren nicht mit dem mysqli-Treiber in codeIgniter
Ich habe diese DB-Konfiguration in meiner lokalen Entwicklungsumgebung
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = ''; //Actual username is put inside these quotes
$db['default']['password'] = '';
$db['default']['database'] = ''; //Actual name of database is put inside quotes
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = APPPATH .'cache';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
Wenn ich das auf einen Produktionsserver übertrage, funktioniert es nicht, deshalb habe ich viele Dinge ausprobiert, aber eine Sache, dieseemed to work
war, den dbdriver zu ändernMysqli anstelle von MySQL. Aber ich musste auch db_debug auf FALSE setzen (also "funktionierte" es nicht die richtige Aussage)
Ich habe viel darüber gelesen, aber ich habe nirgendwo eine Antwort darauf gefunden. (Ich bin nicht zufrieden mit: "Wechsle zu debug = false und es würde funktionieren")
Ich wollte sehen, was das eigentliche Problem ist, also habe ich den lokalen Server ebenfalls auf den mysqli-Treiber umgestellt und dann den Fehler erhalten:
A Database Error Occurred
Unable to connect to your database server using the provided settings.
Filename: C:\Program Files\wamp\www\mellomgarden2\system\database\DB_driver.php
Line Number: 124
Nach einigem Graben sehe ich, dass db_connect () und db_pconnect () genau auf die gleiche Weise funktionieren:
Wenn Sie in der Datei system / database / drivers / mysqli / mysqli_driver.php nachsehen, sieht es so ausconnect()
undpconnect()
arbeiten genau so, weilpconnect()
ruft nur anconnect()
Funktion.damit$db['default']['pconnect'] = TRUE;
ist völlig nutzlos, wenn Sie den mysqli-Treiber verwenden.
function db_connect()
{
if ($this->port != '')
{
return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
}
else
{
return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
}
}
// --------------------------------------------------------------------
/**
* Persistent database connection
*
* @access private called by the base class
* @return resource
*/
function db_pconnect()
{
return $this->db_connect();
}
Bei näherer Betrachtung von db_connect () und db_pconnect () werden Fehler unterdrückt. Ich habe das @ für den Rückgabewert entfernt und dann folgendes erhalten:
Schweregrad: Warnung
Nachricht: mysqli_connect (): (08004/1040): Zu viele Verbindungen
Dateiname: mysqli / mysqli_driver.php
Zeilennummer: 76
Das ist ein weitaus erklärender Fehler
Meiner Meinung nach sollte db_pconnect für den mysqli-Treiber ungefähr so aussehen:
function db_pconnect()
{
$this->hostname = 'p:' . ltrim($this->hostname, 'p:');
return $this->db_connect();
}
Ist dies ein völliger Fehler des CodeIgniter-Entwicklungsteams oder fehlt mir etwas?