mysql_connect AND mysql_pconnect [chiuso]
-
05-07-2019 - |
Domanda
Ho questo dubbio, ho cercato sul web e le risposte sembrano essere diversificate. È meglio usare mysql_pconnect su mysql_connect quando ci si collega a un database tramite PHP? Ho letto che PConnect si ridimensiona molto meglio, ma d'altra parte, essendo una connessione persistente ... avere 10.000 connessioni contemporaneamente, tutte persistenti, non mi sembra scalabile.
Grazie in anticipo.
Soluzione
Le connessioni permanenti non dovrebbero essere necessarie per MySQL. In altri database (come Oracle), fare una connessione è costoso e richiede molto tempo, quindi se puoi riutilizzare una connessione è una grande vittoria. Ma quei marchi di database offrono un pool di connessioni, che risolve il problema in modo migliore.
Effettuare una connessione a un database MySQL è rapido rispetto agli altri marchi, quindi l'utilizzo di connessioni persistenti offre un vantaggio proporzionalmente inferiore per MySQL rispetto a un altro marchio di database.
Anche le connessioni persistenti hanno un aspetto negativo. Il server di database alloca le risorse a ciascuna connessione, indipendentemente dal fatto che siano necessarie o meno. Quindi vedrai molte risorse sprecate senza scopo se le connessioni sono inattive. Non so se raggiungerai 10.000 connessioni inattive, ma anche un paio di centinaia sono costose.
Le connessioni hanno lo stato e sarebbe inappropriato che una richiesta PHP "erediti" " informazioni da una sessione precedentemente utilizzate da un'altra richiesta PHP. Ad esempio, le tabelle temporanee e le variabili utente vengono normalmente ripulite alla chiusura di una connessione, ma non se si utilizzano connessioni permanenti. Allo stesso modo le impostazioni basate sulla sessione come set di caratteri e regole di confronto. Inoltre, LAST_INSERT_ID ()
riporterebbe l'ultimo ID generato durante la sessione, anche se fosse durante una precedente richiesta PHP.
Almeno per MySQL, il rovescio della medaglia delle connessioni persistenti probabilmente supera i loro benefici. E ci sono altre tecniche migliori per raggiungere un'alta scalabilità.
Aggiornamento marzo 2014:
La velocità della connessione MySQL era sempre bassa rispetto ad altre marche di RDBMS, ma sta migliorando ancora.
Vedi http://mysqlserverteam.com/improving-connectdisconnect-performance/
In MySQL 5.6 abbiamo iniziato a lavorare sull'ottimizzazione della gestione e della disconnessione del codice. E questo lavoro è accelerato in MySQL 5.7. In questo post del blog mostrerò prima i risultati che abbiamo raggiunto e quindi descriverò ciò che abbiamo fatto per ottenerli.
Leggi il blog per maggiori dettagli e confronti di velocità.
Altri suggerimenti
Fondamentalmente devi bilanciare il costo di creazione delle connessioni rispetto al mantenimento delle connessioni. Anche se MySQL è molto veloce nell'impostare una nuova connessione, costa comunque - nel tempo di configurazione del thread e nel tempo di configurazione TCP / IP dal tuo server web. Ciò è evidente in un sito di traffico sufficientemente elevato. Sfortunatamente, PHP non ha alcun controllo sulla persistenza delle connessioni. Quindi la risposta è ridurre il timeout di inattività in MySQL a lungo (come fino a 20 secondi) e aumentare la dimensione della cache del thread. Insieme, questo generalmente funziona molto bene.
D'altro canto, l'applicazione deve rispettare lo stato della connessione. È meglio se non fa ipotesi sullo stato in cui si trova la sessione. Se si utilizzano tabelle temporanee, l'utilizzo di CREATE IF NOT EXISTS e TRUNCATE TABLE aiuta molto, così come nominarli in modo univoco (come includere userid). Le transazioni sono un po 'più problematiche; ma il tuo codice può sempre eseguire ROLLBACK in alto, per ogni evenienza.
È molto improbabile che raggiungerai 10000 connessioni. Vai comunque alla fonte ufficiale . (Enfasi mia).
Se non sono presenti connessioni permanenti qualsiasi funzionalità aggiunta, quali sono vanno bene per?
La risposta qui è estremamente semplice - efficienza. Le connessioni persistenti lo sono buono se l'overhead per creare un collegamento al tuo server SQL è elevato. Se o non questo sovraccarico è davvero alto dipende da molti fattori. Tipo cosa tipo di database, indipendentemente dal fatto che non si trova sullo stesso computer acceso quale è il tuo server web, come caricato la macchina su cui si trova il server SQL su è e così via. La linea di fondo è che se l'overhead della connessione è connessioni elevate e persistenti ti aiutano considerevolmente . Causano il bambino processo per connettersi semplicemente una sola volta per tutta la sua durata, invece di ogni volta che elabora una pagina che richiede la connessione al server SQL. Ciò significa che per ogni bambino che aperto una connessione persistente sarà ha il suo aperto persistente connessione al server. Per esempio, se hai avuto 20 figli diversi processi che eseguivano uno script creato una connessione persistente al tuo SQL server, ne avresti 20 diversi connessioni al server SQL, una da ogni bambino.
Si noti, tuttavia, che questo può avere alcuni svantaggi se si utilizza un database con limiti di connessione che sono superato dal bambino persistente connessioni. Se il tuo database ha un limite di 16 connessioni simultanee, e nel corso di un server occupato sessione, tentano 17 thread secondari connettersi, non sarà possibile. Se ci sono dei bug nei tuoi script quali non consentire la chiusura delle connessioni giù (come loop infiniti), il database con solo 16 connessioni può essere rapidamente sommerso. Controlla il tuo documentazione del database per informazioni sulla gestione abbandonata o inattiva connessioni.
mysql_connect ()
e mysql_pconnect ()
funzionano entrambi per la connessione al database ma con poca differenza. In mysql_pconnect ()
, p
sta per connessione di persistenza.
Quando utilizziamo la funzione mysql_connect ()
, ogni volta che apre e chiude la connessione al database, a seconda della richiesta.
Ma nel caso della funzione mysql_pconnect ()
:
-
Innanzitutto, durante la connessione, la funzione tenta di trovare una connessione (persistente) già aperta con lo stesso host, nome utente e password. Se ne viene trovato uno, verrà restituito un identificatore anziché aprire una nuova connessione.
-
In secondo luogo, la connessione al server SQL non verrà chiusa al termine dell'esecuzione dello script. Invece, la connessione rimarrà aperta per uso futuro (
mysql_close ()
non chiuderà la connessione stabilita damysql_pconnect()
).
mysql_pconncet ()
è utile quando hai molti traffici sul tuo sito. In quel momento per ogni richiesta non aprirà una connessione ma la prenderà dal pool. Ciò aumenterà l'efficienza del tuo sito. Ma per uso generale mysql_connect () è la cosa migliore.
mysql_connect ()
1.mysql_connect può essere utilizzato per chiudere la connessione. Ogni volta che apre e chiude la connessione al database, a seconda della richiesta.
2.Qui il database viene aperto ogni volta che la pagina viene caricata in MYSQL connect
3.Quando viene caricata la pagina, il database viene caricato ogni volta
4. Viene utilizzato per chiudere la connessione
Esempio:
<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?>
Descrizione:
host: specifica un nome host o un indirizzo IP come localhost.
mysql_user: specifica il nome utente MySQL
mysql_password: specifica la password MySQL
mysql_pconnect ()
1.Utilizziamo mysql_pconncet (), inizialmente tenta di trovare una connessione persistente aperta.
2.Il mysql_pconncet () apre una connessione persistente
3.The mysql_pconnect () non supporta la stretta connessione
4.mysql_pconnect () non può chiudere la connessione. Qui apri una connessione persistente al database
5.Qui il database non deve essere collegato ogni volta.
6.Il database non deve essere collegato ogni volta in mysql_pconncet ().
maggiori dettagli: http://prittytimes.com/difference-between-mysql_connect- e-mysql_pconnect /