EDIT: Aggiornamento - scorrere verso il basso
EDIT 2: Aggiornamento - problema risolto PHP in esecuzione come applicazione FastCGI (php-cgi) - come emettere richieste concorrenti?
Alcune informazioni di base:
sto scrivendo il mio webserver in Java e una coppia Qualche giorno fa ho chiesto a SO in che modo esattamente Apache si interfacciava con PHP, così posso implementare il supporto PHP. Ho appreso che FastCGI è l'approccio migliore (dal momento che mod_php non è un'opzione). Quindi ho esaminato le specifiche del protocollo FastCGI e sono riuscito a scrivere un wrapper FastCGI funzionante per il mio server. Ho testato phpinfo() e funziona, infatti tutte le funzioni PHP sembrano funzionare bene (postare dati, sessioni, data/ora, ecc. Ecc.).
Il mio server web è in grado di servire richieste simultaneamente (cioè utente1 può recuperare file1.html nello stesso momento in cui utente2 richiede some_large_binary_file.zip), lo fa creando un nuovo thread Java per ogni richiesta utente (terminando quando completato o la connessione utente con il cliente è cancellata).
Tuttavia, non può gestire contemporaneamente 2 (o più) richieste FastCGI. Quello che fa è, li accoda, così quando la richiesta 1 viene completata immediatamente dopo inizia l'elaborazione della richiesta 2. Ho provato questo con 2 pagine PHP, una contiene sleep (10) e l'altra phpinfo().
Come dovrei fare per gestire più richieste poiché so che è possibile farlo (PHP in IIS funziona come FastCGI e può gestire più richieste).
qualche informazione in più:
sto codifica sotto le finestre e il mio file batch utilizzato per eseguire php-cgi.exe contiene:
set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000
ma non depongono le uova 8 bambini, il servizio termina semplicemente dopo 500 richieste.
ho fatto delle ricerche e da Wikipedia: (. Es multipla richieste su una singola connessione)
elaborazione di richieste multiple contemporaneamente viene ottenuto mediante utilizzando una singola connessione con multiplexing interna e/o utilizzando più connessioni
Ora chiaramente le connessioni multiple non funzionano per me, come ogni volta che un cliente si connette sts qualcosa che coinvolge FastCGI crea un nuovo socket per l'applicazione FastCGI, ma non funziona contemporaneamente (invece li accoda).
So che il multiplexing interno delle richieste FastCGI con la stessa connessione viene eseguito emettendo ogni richiesta FastCGI univoca con un diverso request ID. (vedi anche gli ultimi 3 paragrafi del capitolo "Protocollo di comunicazione" in this article).
Non l'ho provato, ma come potrei fare per implementarlo?Lo prendo Ho bisogno di una sorta di thread Java FastCGI che contiene una mappa di qualche tipo e una funzione statica che posso usare per aggiungere richieste a. Quindi nella funzione run() di Thread avrebbe un ciclo while e per ogni ciclo controllerebbe se la Map contiene nuove richieste, in caso affermativo assegnerebbe loro un ID di richiesta e li scriverà nel flusso FastCGI. E poi attendi input etc etc, Come puoi vedere diventa troppo complicato.
Qualcuno conosce il modo corretto di farlo? O qualche pensiero? Grazie mille.
Nota, se necessario, posso fornire il codice per il mio wrapper FastCGI.
Aggiornamento:
Fondamentalmente, ho scaricato nginx e configurarlo per utilizzare PHP come applicazione FastCGI e troppo sofferto dello stesso problema come il mio assistente. Non poteva gestire richieste PHP simultanee. Questo mi porta a credere che il mio codice sia in effetti corretto. Quindi c'è qualcosa di sbagliato in PHP o non lo sto configurando correttamente. Forse è perché sto usando Windows perché alcuni utenti di lighttpd affermano che Windows non può gestire correttamente FastCGI (questo non ha molto senso). Installerò Linux a breve e riferirò ogni progresso con quello.
Molto bene, ho solo bloccato questo problema per un giorno, e non riesco a capire cosa succede nel sonno() di PHP influenzerà altri processi, grazie per la tua risposta e condivisione. – ykc