2012-03-16 13 views
8

Spero di poterlo spiegare abbastanza bene. Sto lavorando alla creazione di PHP library to handle ajax requests through PHP in modo orientato agli oggetti. Attualmente sto riflettendo su un buon modo per implementare una lunga soluzione di sondaggio, ma sono curioso di qualcosa.Polling lungo con PHP su Apache

Apache non gestisce il mantenimento di connessioni multiple aperte molto bene. Il modello thread-per-request rende Apache estremamente inefficiente per il polling lungo. L'utilizzo di server come nginx e lighttpd gestisce questi thread molto meglio quindi nella libreria, ho in programma di implementare diverse funzioni ottimizzate per i server specifici disponibili da una singola chiamata di funzione. Nel caso di Apache, che ha un'enorme quota di mercato per le applicazioni PHP, ho bisogno di una soluzione migliore.

C'è un modo per mettere una richiesta in arrivo in attesa/pausa e continuare l'elaborazione di altre richieste fino a quando non sono pronto a riattivarlo?

Non sono sicuro che abbia senso o se sono sulla buona strada. Qual è una possibile soluzione che SO consiglia per un lungo polling in PHP su un server Apache?

+0

perché sospendere l'elaborazione sul server? non farebbe aspettare molto il tuo utente? – Joseph

+0

Con Apache, utilizza un modello thread-per-request in modo che una richiesta iniziale di pagina in un'applicazione utilizzi un thread e quindi la richiesta ajax (chiamata una volta caricato il DOM) utilizzerà un thread separato. Il problema è che il tentativo di traffico di volumi elevati genererà migliaia di thread e in definitiva disabiliterà il server. –

+0

Abbiamo avuto un problema simile, dopo aver acceso carichi di pagina polling lunghi ajax/PHP caricati casualmente (cca ogni 4-5 carichi) impiegando troppo tempo ... per ora e solo per le notifiche l'ho risolto con NOT sleep() in PHP in qualsiasi modo e spostato la funzionalità timewait in javascript, quindi ora javascript richiede ogni nuova esecuzione PHP ad esempio 10s ma il caricamento della pagina sembra essere OK ora. –

risposta

1

Questo suona come continuazioni. Non puoi assolutamente farlo in PHP, in modo elegante. Se vuoi farlo, la tua migliore possibilità sarebbe quella di salvare lo stato corrente e scrivere il codice in modo tale da poter riprendere da dove ti eri interrotto quando carichi lo stato.

+0

Sto iniziando a venire alla stessa conclusione. Penso che sto solo implementando una soluzione di polling lunga di base e nella documentazione/commenti annotiamo che non è ottimale su determinati ambienti server. In questo modo se qualcuno vuole provare a usarlo, la funzionalità di base è già lì. –

0

Non penso che ci sia una soluzione. Non è possibile distinguere una richiesta di polling da una richiesta normale. Evita solo Apache che potrebbe aiutarti (ad esempio, eseguendo nginx su 80, inoltra tutte le richieste ad Apache su 81, ad eccezione delle richieste di polling).

Inoltre, non penso che tu abbia un problema. Nginx o altro server non è molto più efficiente di Apache. Il polling è una richiesta PHP, Apache con mod_php è meno o più una buona scelta. Nginx non userà meno risorse di Apache nel servire PHP.

+4

'Nginx non userà meno risorse di Apache nel servire PHP. Ne sei sicuro? http://serverfault.com/questions/157520/apache-vs-nginx –

+0

Sicuro. Non leggo nulla in quell'URL che afferma l'opposto. "mod_php è leggermente più veloce di php-fpm", "cgi è molto più lento di mod_php" ecc. Ovviamente, tutto dipende da quanto si esegue un polling lungo rispetto ai normali file PHP/file statici, se si dispone di un proxy inverso nella cache che Apache non è infastidito da file statici, su quanti moduli stai usando in Apache ... – jcisio

Problemi correlati