2010-05-08 7 views
6

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.

+0

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

risposta

6

Ok, sono riuscito a trovare la causa del problema. Non era affatto il mio codice. È PHP, non può generare php-cgi aggiuntivi sotto Windows quando è in esecuzione come modalità FastCGI, sotto Linux funziona perfettamente, ho semplicemente puntato il mio server sul mio IP di Linux e non ha avuto problemi con le richieste FCGI simultanee. Succhia, ma suppongo che sia così ...

Ho approfondito il codice sorgente PHP e ho scoperto che la sezione di codice che risponde a PHP_FCGI_CHILDREN è stata incapsulata da #ifndef WIN32 Quindi gli sviluppatori devono essere a conoscenza del problema

2

Ciao questo arriva un po 'tardi, ho scritto uno spawner per php-cgi.exe su Windows, non perfetto ma potrebbe essere quello che ti serviva. Controllalo allo here.

+0

Oh, molto carino, ci penso! –

+0

halleluya man, dopo 2 giorni di ricerche approfondite su google e rendendosi conto che php-cgi.exe può servire 1 connessione concorrente, desideravo sviluppare localmente su apache e sul server avere nginx, ma volevo avere la stessa configurazione in entrambi gli ambienti. quindi la tua soluzione ha aiutato. btw funziona solo con activepython, perché ha win32processes, il python standard non ha quella lib – Skyzer

2

Re: uova-php script python ...

Grazie @nosam che ha veramente aiutato.
Per coloro che vogliono farlo funzionare rapidamente è necessario il seguente (se il sistema a 64 bit)

ActivePython-2.7.2.5-Win64-x64.msi
pywin32-217.win-amd64-py2.7 .exe

ActivePython non ha le vecchie versioni di questi sul loro www così hai bisogno di fare un po 'di googling intorno per trovare uno specchio di lavoro (ci sono molti là fuori)

una volta scaricato lo src da bitbucket potrebbe essere necessario modificare spawn-php.py (per sistemare la scheda spaci ng), dato che il bit-bucket sembrava incasinare la scheda nel file impedendone l'esecuzione.

All-in-all che mi ha salvato la giornata in un piccolo sito Web di Windows occupato con nginx + fast-cgi.

Grazie amico!

Problemi correlati