2011-08-24 15 views
22

Ho creato un sito Web della comunità sociale in CodeIgniter che ora sta ricevendo un bel po 'di traffico, la società di hosting ha iniziato a lamentarsi dicendo che il database sta ricevendo connessioni null e connessioni che non sono t essere chiuso.Connessioni al database CodeIgniter non chiuse

Non sono del tutto sicuro di cosa sia una query nullo o di come si finirebbe per essere emessa, qualche idea?

Ho aggiunto codice aggiuntivo per forzare le connessioni chiuse quando il codice raggiunge una fine ma apparentemente questo non funziona.

Qualcuno può offrire qualche suggerimento su dove guardare o avviare il debug di un problema come questo?

Grazie

Ho il seguente in fondo alla mia anima MY_Controller

public function __destruct() { 
    $this->db->close(); 
} 
+4

3 risposte e non uno solo di loro è in realtà una risposta alla domanda. –

+0

Il tuo hoster ha riferito che cos'è una 'connessione nulla? – hakre

+0

Purtroppo non ho dettagli sul problema nullo, dall'host: molte connessioni dal sito dove la query stessa è "NULL" – ArthurGuy

risposta

2

hai provato a fare $this->db->close(); dopo una query è fatto?

6

Codeigniter dovrebbe chiudere automaticamente la connessione al database, ma si può implicitamente chiamare con $this->db->close();

Vedi http://codeigniter.com/user_guide/database/connecting.html

+0

Non è quello che sta chiedendo. Ha detto che sta già chiudendo le connessioni alla fine, ma questo non funziona, quindi vuole un modo per risolvere il problema. –

23

Penso che si sta gettting problemns con la configurazione iniziale dal database di connessione Codeigniter.

In questa pagina, è possibile vedere ogni valore da array di config:
http://ellislab.com/codeigniter/user-guide/database/configuration.html

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "root"; 
$db['default']['password'] = ""; 
$db['default']['database'] = "database_name"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = FALSE; 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ""; 
$db['default']['char_set'] = "utf8"; 
$db['default']['dbcollat'] = "utf8_general_ci"; 
$db['default']['swap_pre'] = ""; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

Questa è una base di dati di base di configurazione array, provare a impostare la variabile di pconnect FALSE, quando è acceso , il sistema non chiude alcuna connessione e rimane aperto alle richieste di notizie in qualsiasi momento.

Se si imposta su falso come ho detto, il sistema continuerà a funzionare perfettamente, ma il codeigniter chiuderà e aprirà la connessione quando ha bisogno di utilizzare il database.

Qui, puoi trovare e postare all'interno del forum di codice con un ragazzo che ha un problema con le variabili di pconnect, potrebbe aiutarti! http://codeigniter.com/forums/viewthread/177573/#842016

+1

Grazie per il commento ma la variabile pconnect è già impostata su false. – ArthurGuy

+0

pconnect = false sta lavorando .. Grazie .. –

0

Ho avuto lo stesso problema un po 'di tempo fa, e la soluzione era multiparte (nessuna singola parte del problema è emersa finché tutte le parti non sono diventate problematiche insieme). PConnect dovrebbe essere spento a meno che tu non sappia come usarlo (come hanno detto altri).

Un'altra cosa da considerare è se il server Web è thread (come la modalità di lavoro di Apache - i server web più comuni sono). Se il traffico aumenta e i thread non si chiudono rapidamente, è possibile che si verifichino limiti concomitanti di connessione a server Web/server di database o esaurimento delle risorse di memoria/processore. Ciò potrebbe causare il blocco di alcune connessioni al database.

Quindi, verificherei altri segni del problema e non presumo che il database sia la fonte. Potrebbe benissimo essere un sintomo. Hai qualche informazione sulle connessioni null (come l'utente del database che le ha generate)? Questo potrebbe aiutarti a rintracciarlo ...

Edit: Una cosa che ho dimenticato - a volte gli errori PHP può rovinare le operazioni di autodistruzione di CI (che chiudono automaticamente le connessioni, dalla mia comprensione), per cui si potrebbe verificare l'errore registra anche.

1

Ho avuto problemi simili con CodeIgniter in passato e sono stati causati da connessioni persistenti in MySQL abilitate di default in CodeIgniter. Ho usato la query SHOW PROCESSLIST in MySQL per visualizzare le connessioni aperte, la loro query corrente, il tempo (in secondi) per cui la connessione è stata aperta, ecc. Se la connessione è inattiva il campo Command restituito conterrà Sleep e il campo Info (il query) sarebbe NULL che è probabilmente a cosa si riferisce il tuo host. È un buon punto di partenza per un problema come questo.

Un'altra cosa che desidero notare è una sfumatura di PHP, mysql_close che viene chiamata here dal metodo __destruct del controller in uso per non chiudere una connessione MySQL persistente. PHP chiuderà le connessioni non persistenti alla fine dell'esecuzione dello script, quindi di solito non è necessario chiamarlo.

Mi rendo conto che avevate detto che le connessioni persistenti non erano abilitate, questo è stato il modo in cui ho fatto il debug del mio problema che sembra molto simile al vostro problema.

0

ho risolto lo stesso problema su un sito CI modificando conducente 'mysql' a 'mysqli' in: database.php:

$db['default']['dbdriver'] = "mysqli"; 
Problemi correlati