2015-11-10 31 views
18

capisco che PHP supporta la gestione di più connessioni simultanee e in funzione del server può essere configurato come menzionato in questo answercome vengono richieste simultanee gestite in PHP (usando - discussioni, pool di thread o processi figli)

Come funziona Server gestisce più connessioni, forca un processo figlio per ogni richiesta o gestisce i thread o gestisce l'utilizzo di un pool di thread?

Il linked answer dice che un processo è biforcuto e quindi l'autore nel commento dice thread o processo, che lo rende confuso, se le richieste vengono servite utilizzando processi, thread o pool di thread figlio?

+1

[http://stackoverflow.com/questions/1623914/what-is-thread-safe-or-non-thread-safe-in-php], penso che questo sia quello che stai cercando – anwerj

risposta

14

Come noto, ogni server Web ha il proprio tipo di gestione della richiesta simultanea multile. Solitamente Apache2 schould esegue il fork di un processo figlio per ogni nuova richiesta. Ma puoi in qualche modo configurare questo comportamento come menzionato nella tua risposta StackOverflow collegata.

Nginx ad esempio riceve ogni richiesta in un thread (elabora nuove connessioni in modo asincrono come fa Node.js) o talvolta utilizza il caching (come configurato; Nginx potrebbe anche essere utilizzato come bilanciamento del carico o proxy HTTP). È una questione di scelta del server web giusto per la tua applicazione.

Apache2 potrebbe essere un ottimo server Web ma è necessario più carico di bilanciamento quando si desidera utilizzarlo in produzione. Ma ha anche un buon potere quando si moltiplicano le connessioni di breve durata o anche i documenti che non cambiano affatto (o utilizzando la memorizzazione nella cache).

Nginx è molto buono se si prevedono connessioni di lunga durata con tempi di elaborazione lunghi. Allora non hai bisogno di molto carico di equilibrio.

spero, mi è stato in grado di aiutarvi con questo;)

Fonti:

https://httpd.apache.org/docs/2.4/mod/worker.html

https://anturis.com/blog/nginx-vs-apache/

vi consiglio di guardare anche in: What is thread safe or non-thread safe in PHP?

+0

I don ' t get get it in caso di FastCGI, perché FastCGI viene eseguito come un processo applicativo diverso come sono gestiti i thread/processi per gestire le richieste in entrata?La mia comprensione è che, nel caso di nginx, esso stesso non genererà un nuovo thread/processo nella maggior parte dei casi, piuttosto cercherà di gestirlo in modo async Node.js, ma, come lo gestirà lo stesso FastCGI in PHP - thread o will si blocca fino a quando non vengono elaborate richieste precedenti o dipende dallo sviluppatore di applicazioni PHP o da un pool di processi pre-fork di FastCGI? – prasun

+0

In ogni caso, grazie per i collegamenti, sono utili – prasun

+0

Come Wikipedia dichiara nel loro sito FastCGI, esiste già un pool di processi in possesso del FastCGI-Server per gestire più di una richiesta alla volta. Questo pool verrà inizializzato all'avvio del server FastCGI. – jankal

3

Dopo aver fatto qualche ricerca ho finito con le conclusioni di sotto.

E 'importante considerare come server PHP sono impostati per essere in grado di ottenere intuizioni in it.For configurazione del server e PHP sul proprio, ci potrebbero essere tre possibilità:

1) Utilizzo di PHP come modulo (Per molti server PHP ha una diretta interfaccia del modulo (chiamato anche SAPI))

2) CGI

3) FastCGI

Considerando caso # 1 PHP come modulo, in questo caso il modulo è integrato con il server web stesso e ora mette la palla interamente sul server web come gestisce le richieste in termini di processo di forking, usando thread, pool di thread, ecc.

Per il modulo, Apache mod_php sembra essere molto comunemente usato, e l'Apache stesso gestisce le richieste utilizzando processi e thread in due modelli di cui alla presente answer

Prefork MPM utilizza più processi secondari con un filo ciascuno e ogni processo gestisce una connessione alla volta.

Worker MPM utilizza processi figlio multipli con molti thread ciascuno. Ogni thread gestisce una connessione alla volta.

Ovviamente, altri server possono adottare altri approcci ma, non ne sono a conoscenza.

Per # 2 e # 3, il server Web e la parte PHP vengono gestiti in processi diversi e il modo in cui un server Web gestisce la richiesta e il modo in cui viene elaborato dall'applicazione (parte PHP) varia. Ad esempio, NGINX può gestire la richiesta utilizzando l'I/O asincrono non bloccante e Apache può gestire le richieste usando i thread, ma, il modo in cui la richiesta verrebbe elaborata da FastCGI o dall'applicazione CGI è un aspetto diverso come descritto di seguito. Entrambi gli aspetti, ovvero il modo in cui il server Web gestisce le richieste e il modo in cui viene elaborata la parte PHP, sono importanti per le prestazioni dei server PHP.

Considerando il n. 2, il protocollo CGI ha reso il server Web e l'applicazione (PHP) indipendenti l'uno dall'altro e il protocollo CGI richiede che l'applicazione e il server web vengano gestiti utilizzando processi diversi e il protocollo non promuove il riutilizzo dello stesso processo, che a sua volta significa che è necessario un nuovo processo per gestire ogni richiesta.

Considerando il numero 3, il protocollo FastCGI supera la limitazione del CGI consentendo il riutilizzo del processo. Se si seleziona IIS FastCGI link FastCGI risolve i problemi di prestazioni inerenti al CGI fornendo un meccanismo per riutilizzare un singolo processo più e più volte per molte richieste.

FastCGI mantiene la compatibilità con le librerie non thread-safe da fornendo un pool di processi riutilizzabili e garantire che ogni processo gestisce solo una richiesta alla volta.

Detto questo, in caso di FastCGI sembra che il server gestisce un pool di processi e utilizza il pool di processi per gestire le richieste client in ingresso e dal momento che, la piscina processo non richiede filo di controllo di sicurezza, fornisce una buona prestazione.

3

Penso che la risposta dipenda da come il server Web e il cgi vengono distribuiti.

Nella mia azienda, utilizziamo Nginx come server Web e php-fpm come cgi, quindi la richiesta concorrente viene gestita come processo da php-fpm, non da thread.

Configuriamo il numero massimo di processi e ogni richiesta viene gestita da un singolo processo php, se arrivano più richieste (maggiori del numero massimo di processi), attendono.

Quindi, credo che PHP stesso possa supportarli tutti, ma come utilizzarlo, dipende.

+0

quindi, è il caso di FastCGI e il reqeust di PHP-fpm viene gestito utilizzando il pool di processi con il numero massimo di processi come indicato nella mia risposta? – prasun

+0

voi, nel mio caso, è esattamente quello che intendo. Ma non sono sicuro in altri server web come lo usano. – FisherMartyn

+0

grazie @FisherMartyn – prasun