2009-09-23 19 views
11

Ho problemi con l'utilizzo della classe mysqli in PHP e non sono stato in grado di trovare la risposta da nessuna parte.PHP mysqli riconnessione problema

Nel mio script una classe crea una connessione mysqli che utilizza attraverso le sue funzioni. In seguito, questo script si biforca. La connessione viene utilizzata anche dai bambini, ma sto riscontrando il problema della chiusura della connessione (MYSQL Server Gone Away) nel genitore quando i bambini muoiono.

Prima di passare a mysqli (stava semplicemente usando mysql) ho semplicemente chiamato mysql_ping per assicurare che la connessione db fosse presente prima di eseguire la query nel processo padre. Mysqli ha una funzione di ping simile, ma in realtà non si riconnette se la connessione è sparita. Ho provato a usare mysqli.reconnect = ON con l'impostazione globale senza fortuna (usando php.ini e ini_set).

La funzione php mysql_connect consente di ottenere una connessione già esistente, quindi se usassi mysql anziché mysqli, potrei semplicemente riutilizzare la connessione nel child subito dopo il processo biforcato. MA mysqli non sembra avere tali funzionalità ...

L'unica cosa che ero in grado di fare era chiamare mysqli-> ping() e se questo restituiva false quindi riconnettersi al database nel genitore. Questo è terribilmente inefficiente, e preferirei capire come farlo correttamente con mysqli (e senza bisogno di ricollegamenti manuali) che dovessero tornare a mysql ..

Qualche suggerimento?

risposta

13

Il dottore per mysqli_ping() dice che se si imposta l'opzione globale mysqli.reconnect-1 (nel php.ini) allora mysqli_ping() si riconnette quando rileva la connessione è andato via.

+3

Che ha funzionato. Non mi rendevo conto che non si poteva usare ini_set per modificare questa variabile, ed essendo il genio che sono, ho aggiunto la riga a php.ini prima, non sapendo che esisteva già un mysli.reconnect = Off line più in basso file. Ma rimuovendo quello e usando mysqli.reconnect ha funzionato e reso mysqli-> ping() come proprio mysql_ping. Grazie per l'aiuto! –

0

u può provare qualcosa di un po 'diverso .. invece di ping .. provare a inviare un molto semplice query a bassa intensità come "selezionare ora () "e vedi se ottieni risultati migliori.

+0

il motivo che potrebbe aiutare ... mysql ti vede come un utente attivo invece di qualcuno che sta semplicemente tenendo una connessione e che monta le risorse .. credo che ci siano alcune impostazioni di timeout in my.ini/my.cnf che influenzano questo comportamento .. se hai accesso a quello puoi anche guardarlo dentro –

0

Non è possibile utilizzare le connessioni persistenti? Inoltre, è davvero necessario fork()?

-2

Penso che sia necessario impostare mysqli.reconnect in my.cng, che è la configurazione mysql, piuttosto che php.ini, non sono riuscito a cambiare la riconnessione tramite ini_set, ma il mio admin sys l'ha fatto nel mio. CNF.

Quindi, tantino confuso che altri lo hanno fatto all'interno di php.ini ....

+0

Non vero. 'my.cnf' si riferisce solo al server MySQL, quindi di solito non ha alcuna influenza su un client PHP, e' mysqli' esiste solo all'interno di PHP. [mysqli.reconnect] (http://www.php.net/manual/ en/mysqli.configuration.php # ini.mysqli.reconnect) * è * un'impostazione di configurazione PHP. – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}