2010-05-05 10 views
16

Ho quasi finito di scrivere un server web conforme a HTTP/1.0 sotto Java (nessun utilizzo commerciale in quanto tale, è solo per divertimento) e fondamentalmente voglio includere il supporto PHP. Mi rendo conto che non è affatto un compito facile, ma penso che sarà un bel risultato.Come si interfaccia PHP con Apache?

Quindi voglio sapere come PHP si interfaccia esattamente con il server Web Apache (o con qualsiasi altro server Web), quindi posso imparare da esso e scrivere il mio wrapper PHP. Non deve essere necessariamente mod_php, non mi interessa scrivere un wrapper FastCGI, che a mia conoscenza è in grado di eseguire anche PHP.

Avrei pensato che tutto ciò di cui PHP ha bisogno è l'output che va al client (quindi può interpretare le parti PHP), la richiesta HTTP completa dal client (quindi può estrarre le variabili POST e così via) e il client nome host. E quindi basta prendere il codice PHP analizzato e scriverlo nel flusso di output. Probabilmente ci saranno più cose, ma in sostanza è così che avrei pensato che funzionasse.

Da quello che ho raccolto finora, apache2handler fornisce un'API che PHP utilizza per "connettersi" ad Apache. Immagino sia un'idea guardare il codice sorgente di apache2handler e php5apache2.dll o giù di lì, ma prima di farlo pensavo di chiedere prima a SO.

Se qualcuno ha più informazioni, esperienza o qualche tipo di specifica rilevante per questo, fatemelo sapere.

Grazie in anticipo!

risposta

19

Ci sono 3 modi PHP può essere invocato da Apache:

1) come un modulo - questo comporta che collega l'interprete php contro una libreria di ganci pubblicato dal webserver

2) CGI - il server web avvia un'istanza dell'interprete per ogni richiesta e passa parametri all'interprete tramite stdin, la riga di comando e le variabili di ambiente, stdout viene inviato al client e stderr deve essere scritto nel file error_log

3) fastCGI - questo elimina il sovraccarico di iniziare un nuovo processo per ogni richiesta - l'interp reter viene eseguito come un demone

CGI è il più semplice da implementare ma non scala/esegue bene, il modulo sarebbe di gran lunga il più difficile. FastCGI è quasi veloce quanto l'approccio del modulo. CGI e fastCGI sono API aperte e ben documentate.

Ci sono altri modi per raggiungere il tuo obiettivo - ad es. Quercus

C.

+0

Aha, questo ha molto senso. Grazie! Vedrò questo. Potrei solo provare a far funzionare l'approccio CGI e poi a guardare in FastCGI perché ho guardato le loro specifiche l'altro giorno, ma l'ho trovato molto confuso, forse stavo guardando nel posto sbagliato. –

4

Per dirla semplicemente, questo è come funziona:

Apache normalmente serve file dal recupero del file e l'invio del flusso verso il basso la connessione HTTP. Con PHP, tuttavia, Apache recupera il file, lo immette nel binario PHP e invia lo stream in uscita dal comando verso il basso della connessione HTTP.

+0

Questo è un buon inizio, ma l'interfaccia è più complesso di quello. Non dimenticare che PHP ha abilità come modificare le intestazioni HTTP prima che Apache mandi via il contenuto .. – Matt

+0

Questo è esattamente quello che avevo in mente ad un livello molto semplice, ma sono d'accordo con Matt. PHP fa di più. In questo momento ho una classe Parser in grado di analizzare l'output e le intestazioni dei client appena prima del suo invio (al momento restituisce semplicemente l'output e le intestazioni senza modifiche). E idealmente voglio integrare PHP a questo punto. –

1

Oltre al file php, alla richiesta HTTP e al nome host del client, alcune voci di informazione passano in genere a PHP per impostare alcuni altri elementi del superglobale $_SERVER. La pagina di documentazione collegata ha un elenco di ciò che è tipicamente impostato.

+0

Sì, sono consapevole che in effetti probabilmente sono tutte le informazioni contenute nella sezione "Apache Environment" di phpinfo(). –

+0

Hmm, ho appena realizzato $ _SERVER ha una variabile argv e argc che contiene gli argomenti passati all'interprete. Penso che eseguirò un semplice script PHP e produrrò i contenuti di argv e argc, questo probabilmente mi darà un'idea migliore di come viene invocato PHP. Scrap che - output vuoto - Apache non contatta esternamente php.exe, ci deve essere più lavoro internamente che semplicemente query su php.exe. –

1

La parola chiave è CGI.
È un protocollo estremamente semplice, che serve server Web da anni.
Non è l'unico modo per PHP di interagire con un server Web, ma è più comune e facile da implementare.

In breve, il server deve impostare alcune variabili di ambiente e quindi chiamare un cgi-script che è solo uno script php stesso.