2009-12-12 8 views
6

Utilizzo la stessa libreria di astrazione DB per anni. Ma oggi ha iniziato a scrivere questi messaggi di Notice (8) nel mio log.mysql_pconnect(): invio di 5 byte non riuscito con errno = 32 Tubo rotto

L'applicazione funziona correttamente ma ogni volta che uno script si collega al DB viene registrato lo stesso avviso.

Non riesco a pensare a cosa potrebbe essere cambiato. Questo sta accadendo sulla mia macchina di sviluppo locale.

OS X 10.6.2 
PHP 5.3.0 (cli) 
mysql Ver 14.12 Distrib 5.0.87 
mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 
+0

Hai provato a collegarti tramite l'utilità della riga di comando? –

+0

Esiste qualcosa di simile/correlato anche nel registro mysqld? – VolkerK

+0

Non ho problemi con l'uso del client cli mysql. e come ho detto, mysqlnd si connette e la connessione funziona ma getta questo avviso ob ogni pconnect() ora. –

risposta

1

Può essere perché i tuoi dati contengono caratteri 'utf-8'. Ho avuto il problema simile è causato da esso.

Eccezione: mysql_query(): invio di 1462592 byte non riuscita con errore = 32 tubo rotto

ho usato

mysql -u username -p database < dump_file # this is bad 

per importare il file sql contiene molti caratteri UTF8 (Thai lingua), ma non ho impostato default-character-set = utf8 per [mysql]. Quindi i dati codificati errati nel database hanno causato quel problema.

+0

Ciò può accadere anche se tutto è impostato su utf-8. Ciò include l'utilizzo di utf8mb4. Sto usando MySQL 5.6 con PHP 5.6.20 e ho ancora il problema. Ricordo che è iniziato quando ho cercato di implementare connessioni persistenti. –

11

Se qualcuno è alle prese con questo problema, qui è la correzione:

Provare a cambiare/impostare wait_timeout nel mysql my.cnf file di configurazione:

wait_timeout=3600 

Questo file di configurazione si trova nella /etc/mysql/my.cnf (Ubuntu/Debian) e /usr/local/mysql/my.cnf (OSX).

Riavviare il server mysql e dovrebbe funzionare.

0

basta rimuovere il driver mysqlnd e utilizzare mysqlimysqlnd più moderno, ma per quanto riguarda la stabilità? prossimi comandi risolvere il problema

apt-get remove php5-mysqlnd

apt-get install php5-PDO-mysql

3

unica soluzione che ho trovato finora è, cambiando

// From 
PDO::ATTR_PERSISTENT => true 
// To 
PDO::ATTR_PERSISTENT => false 

Non così felice con questo, ma funziona nel frattempo. Sto usando un PC molto vecchio per progetti personali, quindi immagino che il problema potrebbe avere a che fare con la mancanza di risorse.

+0

Ho notato che questo ha avuto inizio quando ho provato ad usare anche le connessioni persistenti. Forse mi manca qualcosa. –

2

Sto usando PHP 5.6.20, PDO (solo eccezioni di lancio) e MySQL 5.6.28 con connessioni permanenti e TUTTO è utf8mb4. Il mio intero stack è impostato per utf-8 (impostazioni della stringa dsn, connessioni, database del database server, tabelle, colonne, Apache 2.4.12, PHP, tutte le pagine web, CSS ... tu lo chiami).

Viene visualizzato il seguente messaggio di errore a intermittenza ed è mistificante e fastidioso.

Avviso: PDO :: __ construct(): invia su 5 byte riuscita con errore = 32 tubo rotto nel file/foo/bar/baz

Supponendo una connessione permanente è un non interattivo uno , il manuale di MySQL 5.6 (5.1.4 Variabili di sistema del server) dice quanto segue sulla variabile di sistema del server wait_timeout.

Il numero di secondi il server attende per l'attività su un non interattiva collegamento prima di chiuderlo.

predefinito: 28800 sec

(28000 sec/1) * (1 hour/3600 sec) = 8 hours

massima: 31.536.000 sec

((31536000 sec/1) * (1 hr/3600 sec) * (1 day/24 hrs) = 365 days 

Pertanto, controllare wait_timeout nella vostra my.cnf e decidere se le connessioni persistenti sono quello che ti serve. Inoltre, dovrai investire per rendere la tua applicazione più affidabile per tenere conto di una connessione persistente che è stata abbattuta. Chiaramente, non vuoi che il tuo cliente torni il giorno dopo (dopo essere tornato a casa per la notte) e dì "Che diamine ?!"