Cosa causa l'avviso "max_user_connections" nel frontend di WordPress?

19 apr 2016, 01:02:24
Visualizzazioni: 18.8K
Voti: 3

Attualmente sto ricevendo questo errore solo nel front-end (non all'interno di /wp-admin):

Warning: mysqli_real_connect(): (HY000/1203): L'utente xxx ha già più di
'max_user_connections' connessioni attive in
/hermes/.../public_html/myhome/wp-includes/wp-db.php alla riga 1489

Warning: mysql_connect(): L'utente xxx ha già più di
'max_user_connections' connessioni attive in
/hermes/.../public_html/myhome/wp-includes/wp-db.php alla riga 1515
Errore durante la connessione al database

E mi chiedo come mai appaia quando sono l'unico visitatore? Sto usando WP 4.5.

Ho contattato l'hosting che gentilmente ha risposto come segue:

Attualmente il tuo sito web mostra
'Errore durante la connessione al
database' perché l'utente del
database ha superato il limite di
connessioni simultanee per un
utente di un database, che è 10. Questo
è il motivo per cui il sito mostra
l'errore di database. Lo script genera
l'errore di connessione simultanea
quando il numero di connessioni al
database supera il limite impostato sul
server. Nella nostra piattaforma
condivisa, consentiamo un
massimo di 10 connessioni
simultanee a un database, che è
ideale nella piattaforma condivisa e
non è possibile aumentare questo limite.
Il limite di query per il tuo sito web
verrà reimpostato entro un paio d'ore
quindi dovresti poter accedere al
database dopo un paio d'ore.

Ci sono due casi in cui lo script
genera l'errore sopra descritto, uno è
quando c'è un traffico elevato verso il
sito e le connessioni simultanee al
database raggiungono il limite e il
secondo caso è quando la connessione
al database non viene chiusa nello
script, anche con un traffico moderato
lo script genera l'errore di connessione
simultanea. Per superare questo
problema, devi chiudere la connessione
al database immediatamente dopo aver
recuperato il contenuto richiesto dal
database. Per chiudere la connessione
al database puoi usare la funzione PHP
mysql_close() con il parametro di
connessione. Questo ti aiuterà a
utilizzare in modo efficiente il limite
di connessioni al database.

In altre parole, tutto funziona correttamente dal nostro lato, è un errore di WP.

7
Commenti

Stai avendo problemi di hosting. Questo non è strettamente correlato a WordPress. Sei tu che ospiti questo sito web?

prosti prosti
19 apr 2016 02:00:01

Sì. Ma il mio pannello di amministrazione funziona perfettamente. Per favore controlla la risposta dell'host sopra.

Ramnath Ramnath
19 apr 2016 02:18:07

@prosti No, questo non è un problema di hosting. Il problema sembra essere un tema o un plugin. 10 connessioni contemporanee sono più che sufficienti per la maggior parte dei casi d'uso in scenari di siti più piccoli.

kaiser kaiser
19 apr 2016 02:52:54

@kaiser Stranamente il problema a volte scompare completamente. Puoi dirmi come posso risolvere il problema senza pasticciare? Ho perso un sacco di tempo. Grazie!

Ramnath Ramnath
19 apr 2016 03:17:57

Suggerirei di installare il plugin debug bar e iniziare a controllare le query. Potrebbe facilmente essere che alcune stiano impiegando troppo tempo, producendo così troppe query concorrenti.

kaiser kaiser
19 apr 2016 03:20:22

@kaiser Ho provato debug bar. Ma non è stato d'aiuto poiché il problema si verifica quando il sito non si connette. Ho anche capito che è un problema del tema. Quando cambio il tema in Twenty Fifteen tutto funziona senza problemi! La domanda è: come posso investigare e applicare le correzioni appropriate? Grazie.

Ramnath Ramnath
19 apr 2016 23:29:03

Aggiorna la tua domanda con le tue scoperte. Cerca anche di capire esattamente cosa sta eseguendo le query su quel sito che va in crash. Poi possiamo parlare ulteriormente.

kaiser kaiser
19 apr 2016 23:33:35
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 3
3

Non è relativo a WordPress, quindi non sono sicuro di avere il diritto di rispondere qui, ma puoi comunque aumentare max_user_connections nel file di configurazione my.cnf di MySQL visto che stai solo testando.

Ci sono diverse cause per l'esaurimento delle connessioni, le più comuni riguardano situazioni in cui il server Web/App crea un numero insolitamente elevato di connessioni a causa di una configurazione errata, di uno script che perde connessioni o ne crea troppe per errore.

La soluzione: alcune persone aumentano max_connections a un numero molto alto così che MySQL non esaurisca mai le connessioni.

Tuttavia, questo può causare problemi di utilizzo delle risorse, consumando memoria e facendo sì che il server MySQL venga terminato dal processo OOM killer o che abbia prestazioni molto scarse a causa dell'elevata contesa.

19 apr 2016 02:05:20
Commenti

Ma poi l'host dice che è un errore di WP. Ho incluso la loro risposta nella mia risposta sopra. Per favore controlla.

Ramnath Ramnath
19 apr 2016 02:19:33

Potresti avere un'invasione di mysql_connect() senza chiuderla. Cattiva pratica in WordPress tra l'altro. Riflettici.

prosti prosti
19 apr 2016 02:23:01

Ma ho appena aggiornato il mio WP alla versione 4.5 recentemente. Cosa devo fare ora?

Ramnath Ramnath
19 apr 2016 02:38:02
4

Per prima cosa, vuoi abilitare gli errori per $wpdb, l'astrazione del database di WordPress:

$GLOBALS['wpdb']->show_errors;

Altrimenti nessuna delle tue connessioni al database morirà davvero e interromperà con un'istanza di \WP_Error. Il codice di errore predefinito è un 500.

Il seguente errore proviene da \wpdb::db_connect():

Errore durante la connessione al database

Ci sono due casi in cui db_connect() entra in gioco:

  1. Connettersi al database
  2. Verificare se esiste una connessione al database

Solo il primo è autorizzato a interrompersi. Se la connessione morisse mentre viene eseguito solo il controllo, non interromperà e non genererà questo errore. Ora la connessione viene stabilita da \wpdb_driver::connect(), che verifica se la connessione è abilitata e disponibile. Questo ti dice che il tuo problema effettivo è proprio la connessione stessa. Puoi verificarlo (non è uno scherzo) nel seguente file:

# interface-wp-db-driver.php
<?php
abstract class wpdb_driver {

È meglio non pensare se ci sia qualche correlazione tra la qualità complessiva del codice core di WP e la profonda comprensione delle interfacce e delle classi astratte qui.

Poco prima che la connessione al database venga dichiarata "fallita" e l'errore venga visualizzato, c'è una bella riga:

require_once WP_CONTENT_DIR . '/db-error.php';

Questo significa che viene caricato un Drop In prima che tutto die. Puoi usarlo e avviare un meccanismo di debug lì. Hai a disposizione tutto il core di WP lì dentro. Puoi iniziare a inviarti email, registrare quegli errori in qualche stack ELK/Kibana, Spark o qualsiasi altro, qualche SaaS o persino su Slack (o semplicemente su un file di testo). Registra i tuoi errori lì, registra cosa sta succedendo, esamina le route, le richieste, i dettagli della connessione al database, qualsiasi cosa pensi possa aiutarti.

20 apr 2016 00:40:44
Commenti

In realtà era un errore del tema. Dopo aver fallito tutti i test, ho chiesto al creatore del tema di verificare e lui lo ha corretto, riconoscendo l'errore. Grazie.

Ramnath Ramnath
2 mag 2016 18:11:17

Potresti per favore aggiungere l'errore esatto e la soluzione (la sua correzione) come risposta? Questo potrebbe aiutare altri utenti che incontrano lo stesso problema, altrimenti la tua domanda rimarrà aperta per sempre. Grazie.

kaiser kaiser
2 mag 2016 22:25:06

Mi è stato chiesto di inviare i dettagli di accesso e dopo di ciò non sono sicuro di cosa abbia fatto esattamente l'autore, ma sì, potrebbe aver applicato alcune correzioni. Tutto quello che so è che il tema è stato aggiornato. Quindi suggerirei a chiunque abbia problemi simili di aggiornare il core di WP e anche il tema alle versioni più recenti. Grazie.

Ramnath Ramnath
2 mag 2016 22:46:23

@Ramnath Scusa, ma questa non è una soluzione. Hai esternalizzato il problema qui, per favore chiedi all'autore di rispondere qui o chiedigli le correzioni. Vorrai avere questa comprensione tu stesso nel caso in cui dovessi ricostruire il sito dopo un hack o perché il tuo host ha fallito o per altre circostanze.

kaiser kaiser
3 mag 2016 01:54:16
1

I server web sono multitasking... Assumendo che il tuo tema non tenti di accedere al database direttamente (non tramite la classe WPDB), ogni connessione utente dovrebbe corrispondere al tempo di elaborazione di una richiesta gestita da WordPress.

Assumendo questo, probabilmente hai un rallentamento nell'elaborazione di ogni richiesta, combinato con diverse richieste gestite "contemporaneamente" - cosa che può accadere se il tuo tema carica dinamicamente contenuti tramite AJAX.

(questo è fondamentalmente ciò che ti ha detto il tuo hosting, e ha senso)

20 apr 2016 00:53:38
Commenti

Una volta mi è successo e ero convinto che l'hosting avesse fatto casino o che qualche hacker avesse preso il controllo del sito. Alla fine si è rivelato essere una query che impiegava circa 6 volte più tempo per ogni termine aggiunto, il che faceva crescere molto rapidamente il tempo di esecuzione. Quando abbastanza utenti hanno iniziato a eseguire questa query, è stato il finimondo. L'operazione non si completava e le connessioni al database non si chiudevano. Ti consiglierei di verificare se potresti avere degli script simili e anche di installare il plugin Query Monitor e navigare sia nel front-end che nel back-end per identificare query lente.

Joel M Joel M
15 feb 2018 08:58:26