Domanda

Sto utilizzando il livello PDO di PHP per l'accesso ai dati in un progetto, mi sono documentato e ho visto che ha un buon supporto innato per le connessioni DB persistenti.Mi chiedo quando/se dovrei usarli.Vedrei vantaggi in termini di prestazioni in un'app ricca di CRUD?Ci sono aspetti negativi da considerare, magari legati alla sicurezza?

Se per te è importante, sto usando MySQL 5.x.

È stato utile?

Soluzione

Potresti usarlo come un "insieme di regole" approssimativo:

, utilizza connessioni persistenti, se:

  • Ci sono solo poche applicazioni/utenti che accedono al database, ad es.non si otterranno 200 connessioni aperte (ma probabilmente inattive), perché ci sono 200 utenti diversi condivisi sullo stesso host.
  • Il database è in esecuzione su un altro server a cui si accede tramite la rete
  • Una (una) applicazione accede al database molto spesso

NO, non utilizzare connessioni persistenti se:

  • La tua applicazione deve accedere al database solo 100 volte all'ora.
  • Hai molti server web che accedono a un server database
  • Stai utilizzando Apache in modalità prefork.Utilizza una connessione per ogni processo figlio, che può aumentare abbastanza rapidamente.(tramite @Powerlord nei commenti)

L'utilizzo di connessioni persistenti è notevolmente più veloce, soprattutto se si accede al database tramite una rete.Non fa molta differenza se il database è in esecuzione sulla stessa macchina, ma è comunque un po' più veloce.Tuttavia, come dice il nome, la connessione è persistente, ovverorimane aperto, anche se non viene utilizzato.

Il problema è che nella "configurazione predefinita", MySQL consente solo 1000 "canali aperti" paralleli.Successivamente, le nuove connessioni verranno rifiutate (puoi modificare questa impostazione).Quindi, se hai, ad esempio, 20 server Web con ogni 100 client e ognuno di essi ha un solo accesso alla pagina all'ora, semplici calcoli ti mostreranno che avrai bisogno di 2000 connessioni parallele al database.Non funzionerà.

Quindi:Usalo solo per applicazioni con molte richieste.

Altri suggerimenti

In breve, la mia esperienza dice che le connessioni persistenti dovrebbero essere evitate il più possibile.

Tieni presente che mysql_close è una no-operazione (no-op) per le connessioni create utilizzando mysql_pconnect.Ciò significa che la connessione persistente non può essere chiusa dal client a piacimento.Tale connessione verrà chiusa dal server mysqldb quando non si verifica alcuna attività sulla connessione per una durata superiore a wait_timeout.Se wait_timeout ha un valore elevato (diciamo 30 minuti), quindi il server mysql db può essere facilmente raggiunto max_connections limite.In tal caso, mysql db non accetterà alcuna futura richiesta di connessione. Questo è il momento in cui il cercapersone inizia a emettere un segnale acustico.

Per evitare di raggiungere max_connections limite, l'uso della connessione persistente richiede un attento bilanciamento delle seguenti variabili...

  1. Numero di processi Apache su un host
  2. Numero totale di host che eseguono Apache
  3. variabile wait_timout nel server mysql db
  4. variabile max_connections nel server mysql db
  5. Numero di richieste servite da un processo Apache prima che venga nuovamente generato

Quindi, usa una connessione persistente dopo aver riflettuto abbastanza.Potresti non voler invitare problemi di runtime complessi per un piccolo guadagno che ottieni dalla connessione persistente.

Creare connessioni al database è un'operazione abbastanza costosa.Le connessioni persistenti sono una buona idea.Nel mondo ASP.Net e Java, abbiamo il "pooling delle connessioni", che è più o meno la stessa cosa, e anche una buona idea.

IMO, la vera risposta a questa domanda è ciò che funziona meglio per la tua app.Ti consiglierei di confrontare la tua app utilizzando sia connessioni persistenti che non persistenti.

Maggie Nelson @ Orientato agli obiettivi pubblicato su questo in agosto e Robert Swartout ha pubblicato un post di accompagnamento con alcuni numeri difficili.Entrambe sono letture piuttosto buone.

A mio modesto parere:

Quando utilizzi PHP per lo sviluppo web, la maggior parte della tua connessione "vivrà" solo per la durata dell'esecuzione della pagina.Una connessione persistente ti costerà un sacco di spese generali poiché dovrai inserirla nella sessione o qualcosa del genere.

Il 99% delle volte una singola connessione non persistente che muore alla fine dell'esecuzione della pagina funzionerà perfettamente.

Il restante 1% delle volte probabilmente non dovresti utilizzare PHP per l'app e non esiste una soluzione perfetta per te.

Stavo per porre la stessa domanda ma invece di ripetere la stessa domanda aggiungerò semplicemente alcune informazioni che ho trovato.

Vale anche la pena notare che la nuova estensione mysqli non include nemmeno l'opzione per utilizzare connessioni al database persistenti.

Al momento sto ancora utilizzando le connessioni permanenti, ma prevedo di passare a quelle non persistenti nel prossimo futuro.

In generale, a volte dovrai utilizzare connessioni non persistenti ed è utile avere un unico modello da applicare alla progettazione delle connessioni database (purché ci siano relativamente pochi vantaggi nell'utilizzare connessioni persistenti nel tuo contesto).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top