2009-02-20 11 views
5

Sto usando PHP con Zend Framework e le connessioni di Database da sole sembrano richiedere più tempo di 0,02 secondi che Google impiega a fare una query. La cosa strana oggi ho visto un video che diceva che Google si connette a 1000 server per una singola query. Con la latenza, mi aspetto che un server per ogni query sia più efficiente di avere più server in diversi datacenter che gestiscono roba.Come ottenere Google come velocità con php?

Come posso far funzionare insieme PHP, MySQL e Zend Framework e raggiungere velocità uguali?

Il caching è l'unico modo? Come ottimizzi il tuo codice per impiegare meno tempo a "renderizzare".

+0

non può essere fatto con PHP e MySQL ... –

+0

200 ms = 0,2 secondi tra i due. Dovresti essere in grado di fare * that * in php? – krosenvold

+0

In primo luogo, è il momento in cui Google visualizza il tempo effettivo impiegato per generare la pagina (conect, query, echo ...) o è solo il tempo necessario per eseguire la query? Credo che sia solo la domanda. Ho molte pagine che impiegano 0,05 secondi per caricare l'intera pagina. –

risposta

5

Qualche tempo fa Google ha deciso di mettere tutto nella RAM.

http://googlesystem.blogspot.com/2009/02/machines-search-results-google-query.html

Se non avete mai di interrogare il disco rigido, i risultati miglioreranno in modo significativo. Il caching aiuta perché non si esegue una query sul disco rigido, ma lo si fa ancora quando c'è un errore di cache (a meno che non si intenda il caching con PHP, il che significa che si compila il programma PHP solo quando la sorgente è stata modificata).

+0

come faccio a verificare se il mio db è in ram completamente? – Thomaschaaf

+0

Google sta usando il loro motore DB che sospetterei. Non penso che tu possa forzare MySQL a mettere l'intero database nella RAM. –

+0

Si può sempre usare il cluster MySQL! Tutto va alla RAM con i checkpoint occasionali sul disco. Piuttosto avanzato per l'installazione, però. Potresti anche usare tutte le tabelle di memoria, ma le cose andrebbero 'poof!' se il server si arresta. – jonstjohn

8

Esistono molte tecniche che Google utilizza per raggiungere la quantità di throughput che offre. MapReduce, Google File System, BigTable sono alcuni di quelli.

Ci sono alcuni molto buoni libero & alternative open source a queste, vale a dire Apache Hadoop, Apache HBase e Hypertable. Yahoo! sta utilizzando e promuovendo i progetti Hadoop parecchio e quindi sono abbastanza attivamente mantenuti.

+0

Quali buone alternative gratuite ci sono? – Thomaschaaf

+0

Ho modificato la mia risposta per aggiungere alcune buone alternative. –

+0

Grazie. (Devo scrivere qualcosa qui) – Thomaschaaf

3

in realtà dipende da ciò che si sta cercando di fare, ma ecco alcuni esempi:

  • analizzare le vostre domande con spiegare. Nell'ambiente di sviluppo è possibile generare query e tempi di esecuzione nella parte inferiore della pagina: ridurre il numero di query e/o ottimizzare quelli lenti.

  • Utilizzare uno strato di cache. Sembra che Zend possa essere abilitato per memcache. Ciò può potenzialmente velocizzare notevolmente l'applicazione inviando richieste al livello di cache ultraveloce invece del db.

  • Controlla il tempo di caricamento del front-end. Usa il componente aggiuntivo YSlow di Yahoo su Firebug. Limita le richieste http, imposta le intestazioni future future per memorizzare js, css e immagini. Ecc

È possibile ottenere velocità lampo sul vostro web app, probabilmente non così rapidamente come google, se ottimizzate ogni strato della vostra applicazione. I tuoi tempi di connessione DB non sono probabilmente la parte più lenta della tua app.

1

Se è per un motore di ricerca, il collo di bottiglia è il database, a seconda delle sue dimensioni.

Per velocizzare la ricerca di testo completo su un set di grandi dimensioni, è possibile utilizzare Sphinx. Può essere configurato su 1 o più server. Tuttavia, dovrai adattare il codice di query esistente, dato che Sphinx viene eseguito come un daemon di ricerca (le librerie sono disponibili per la maggior parte delle lingue)

0

In base al link fornito da @Coltin, i tempi di risposta di google sono nell'ordine di 0,2 secondi. , non .02 secondi.Finché la tua applicazione ha un design efficiente, credo che dovresti riuscire a farlo su molte piattaforme. Anche se non conosco PHP, mi sorprenderebbe se .2 secondi fosse un problema.

2

Memcached è una soluzione consigliata per l'ottimizzazione della memorizzazione/recupero in memoria su Linux.

6

Sto usando PHP con Zend Framework e database si collega solo sembrano richiedere più tempo rispetto ai 0,02 secondi Google vuole per fare una query.

Le operazioni di connessione al database sono di peso massimo, indipendentemente da chi si è: utilizzare un pool di connessioni in modo da non dover inizializzare le risorse per ogni richiesta.

Le prestazioni riguardano l'architettura e non il linguaggio.

+0

+1 per la verità che "Le prestazioni riguardano l'architettura e non il linguaggio". Odio queste domande: P –

1

Google dispone di un sistema enorme e altamente distribuito che incorpora molte tecnologie proprietarie (incluso il proprio hardware e sistemi operativi, file e database).

La domanda è come chiedere: "Come posso rendere la mia macchina un camion?" e sostanzialmente privo di significato.

+0

Sembra una risposta ragionevole per me - un-downvoted. –

0
  • caching del codice APC;
  • Zend_Cache con APC o Memcache backend;
  • CDN per i file statici;
2

Gli script PHP di default vengono interpretati ogni volta che vengono chiamati dal server http, quindi ogni chiamata avvia l'analisi degli script e probabilmente la compilazione da parte di Zend Engine. È possibile eliminare questo collo di bottiglia utilizzando la memorizzazione nella cache di script, come APC. Mantiene lo script PHP compilato una volta in memoria/su disco e lo usa per tutte le richieste successive. I guadagni sono spesso significativi, specialmente nelle app PHP create con framework sofisticati come ZF.

Ogni richiesta per impostazione predefinita apre una connessione al database, quindi è necessario utilizzare una sorta di pool di connessioni al database o connessioni permanenti (che non sempre funzionano, a seconda della configurazione del server HTTP/php). Non ho mai provato, ma forse c'è un modo per usare memcache per mantenere gli handle di connessione al database.

È anche possibile utilizzare memcache per conservare i dati di sessione, se vengono utilizzati su ogni richiesta. La loro persistenza non è così importante e memcache aiuta a renderlo molto veloce.

L'attuale "problema" è che PHP funziona in modo un po 'diverso da altri framework, perché funziona in modo SSI (include lato server) - ogni richiesta viene gestita dal server http e se richiede l'esecuzione di uno script PHP, il suo interprete viene inizializzato e gli script caricati, analizzati, compilati ed eseguiti. Questo può essere paragonato a salire in macchina, avviare il motore e andare per 10 metri.

L'altro modo è, diciamo, un modo application-server, in cui l'applicazione Web gestisce le richieste nel proprio loop, condividendo sempre le connessioni del database e non inizializzando il runtime più e più volte. Questa soluzione offre una latenza molto più bassa. Questo d'altra parte può essere paragonato a essere già in una macchina da corsa e usarlo per guidare gli stessi 10 metri. ;)

Le precedenti soluzioni di cache/precompilatura e pooling sono le migliori per ridurre il sovraccarico di init.PHP/MySQL è ancora una soluzione basata su RDBMS, e c'è una buona ragione per cui BigTable è, beh, solo un hash grande, grosso, distribuito in maniera massiccia (un po 'di eccessiva semplificazione, lo so) - si legge su High Scalability.

Problemi correlati