server e richiesta di comprensione

1

Voglio sapere che cosa fa un server per eseguire un'applicazione php. Di seguito è quello che penso:

cliente A tipi www.blahblahblah.blah /

  1. Il server risolve url e directory ecc.
  2. Server vai all'indice.php
  3. index.php ha una classe Pattern Singleton con una variabile statica chiamata instance.

Ora il server assegna la memoria a quella variabile statica nella propria RAM in modo che tutte le richieste successive a questa prima utilizzino la stessa variabile statica? O per ogni nuova richiesta il server assegna nuova memoria e quella nuova avrà un nuovo spazio assegnato a quella variabile statica?

La mia confusione: se ogni richiesta viene eseguita nel proprio spazio di memoria, allora cos'è una connessione persistente?

Seconda cosa che mi chiedo: posso avere un programma desktop che invia continuamente una chiave speciale alla mia applicazione web e la mia applicazione web sta inviando continuamente la chiave per rendere HTTP una connessione piena invece di una connessione meno? In questo modo posso confermare chi è connesso alla mia APP come client, invece, che è connesso a INTERNET. Conosco le sessioni ma rendono meno la connessione http e quindi c'è possibilità di spoofing e dirottamento di sessione. So che puoi rendere sicura la sessione, ma la mia app non saprà se il cliente è morto e può cancellare i dati dalla sessione e dire agli altri che il client blah è disconnesso.

    
posta Khurram Ijaz 09.06.2011 - 07:29
fonte

1 risposta

6

HTTP è fondamentalmente senza stato. Ciò significa che esiste un ciclo di vita, che inizia con una richiesta del client e termina quando il client ha ricevuto la risposta e, al di fuori di questo ciclo di vita, non viene eseguito alcun codice. Con PHP almeno, lo script viene avviato completamente di nuovo per ogni richiesta, quindi non è possibile mantenere lo stato da una richiesta all'altra semplicemente usando una variabile statica o qualcosa del genere. Per questo motivo, non è possibile rilevare sul server quando l'utente chiude il browser: la connessione termina non appena il ciclo richiesta / risposta è completo (ovvero, quando il client ha ricevuto la risposta). Questo, e il mantenimento dello stato, sono i problemi centrali nella programmazione di applicazioni Web e alcuni trucchi sono stati concepiti per risolverli (parzialmente).

Lo stato può essere trasferito alla successiva richiesta con diversi mezzi:

  • Inserisci lo stato nei campi nascosti e rileggili di nuovo su un postback (in pratica, pubblicando lo stato avanti e indietro)
  • Utilizza le sessioni (archivia un ID lato client, invialo insieme a ciascuna richiesta e conserva un gruppo di file di sessione sul server, che contengono il tuo stato)
  • Codifica lo stato nell'URL (ad esempio, in quale lingua qualcuno sta visualizzando la pagina, quale oggetto sta guardando ecc.)

Per quanto riguarda il rilevamento di una disconnessione, l'unico metodo che è realmente valido è un "battito": invia un messaggio ajax molto breve ogni pochi secondi (con un ID di sessione o un ID utente per favore, così puoi dire dove sta arrivando da), e quando si smettono di ricevere messaggi heartbeat sul server, si può dire che il client si è disconnesso. Ovviamente funziona solo con javascript abilitato, usa una larghezza di banda extra (anche se non molto), mette a dura prova il tuo server (se hai mille utenti, un heartbeat al secondo significa che dovrai servire 60.000 richieste al minuto) e quando la rete è troppo in ritardo, otterrai risultati inaffidabili.

Le connessioni persistenti non hanno nulla a che fare con questo: sono un'ottimizzazione a livello HTTP per evitare il sovraccarico di stabilire nuove connessioni per le richieste successive allo stesso host. Per quanto riguarda PHP, le connessioni persistenti sono trasparenti, cioè PHP si comporterà allo stesso modo se la tua connessione è persistente o meno.

    
risposta data 09.06.2011 - 08:15
fonte

Leggi altre domande sui tag