Richieste simultanee a script PHP


85

Se il motore PHP è già nel mezzo dell'esecuzione di uno script sul server, cosa succederebbe ad altre richieste simultanee del browser allo stesso script?

  • Le richieste verranno messe in coda?
  • Verranno ignorati?
  • Ogni richiesta avrà la propria istanza di script?
  • Qualche altra possibilità?

Risposte:


140

Il server, a seconda della sua configurazione, può generalmente servire centinaia di richieste allo stesso tempo - se si utilizza Apache, l' MaxClientsopzione di configurazione è quella che dice:

La MaxClientsdirettiva stabilisce il limite al numero di richieste simultanee che verranno servite.
Qualsiasi tentativo di connessione oltre il MaxClients limite verrà normalmente accodato, fino a un numero basato sulla direttiva ListenBacklog.
Una volta che un processo figlio viene liberato alla fine di una richiesta diversa, la connessione verrà quindi servita.


Il fatto che due client richiedano la stessa pagina non è un problema.

Così :

Le richieste verranno messe in coda?

No ; tranne che :

  • c'è qualche blocco da qualche parte - che può accadere, ad esempio, se le due richieste provengono dallo stesso client, e stai usando sessioni basate su file in PHP : mentre uno script è in esecuzione, la sessione è "bloccata", il che significa che il server / client dovrà attendere il termine della prima richiesta (e il file sbloccato ) per poter utilizzare il file per aprire la sessione per il secondo utente.
  • le richieste provengono dallo stesso client E dallo stesso browser; la maggior parte dei browser accoderà le richieste in questo caso, anche quando non c'è nulla lato server che produce questo comportamento.
  • ci sono più dei MaxClientsprocessi attualmente attivi - vedere la citazione dal manuale di Apache poco prima.


Verranno ignorati?

No: ciò significherebbe che un solo utente può utilizzare un sito web contemporaneamente; questo non sarebbe molto carino, vero?

Se fosse così, non potrei postare questa risposta, se tu dovevi premendo F5 nello stesso momento per vedere se qualcuno ha risposto!
(Beh, SO non è in PHP, ma i principi sono gli stessi)


Qualche altra possibilità?

Sì ^^


modifica dopo aver modificato l'OP e il commento:

Ogni richiesta avrà la propria istanza di script?

Non esiste " istanza di script ": in parole povere, ciò che accade quando viene effettuata una richiesta a uno script è:

  • il server web esegue un fork di un altro processo per gestire la richiesta (spesso, per motivi di prestazioni, quei fork vengono effettuati in anticipo, ma questo non cambia nulla)
  • il processo legge lo script PHP dal disco
    • più processi possono farlo contemporaneamente : non c'è alcun blocco sulla lettura del file
    • il file viene caricato in memoria; in un blocco di memoria distinto per ogni processo
  • il file PHP in memoria è " compilato " in opcode - ancora in memoria
  • questi codici operativi vengono eseguiti - sempre dal blocco di memoria che appartiene al processo che risponde alla tua richiesta


In realtà, puoi avere due utenti che inviano una richiesta allo stesso script PHP (o a script PHP distinti che includono tutti lo stesso file PHP) ; questo non è sicuramente un problema, o nessuno dei siti web su cui ho mai lavorato funzionerebbe!


Se più richieste simultanee stanno accedendo allo stesso file php quale sarebbe il risultato. le altre richieste verranno mantenute in sospeso o ogni richiesta avrà la propria istanza di script?
Kevin Boyd,

3
Non esiste una "istanza di script": ogni richiesta viene elaborata da un processo (o thread) distinto ;; gli script vengono letti dalla memoria / disco, ma lo stesso file può essere letto da molti processi contemporaneamente senza problemi (almeno, su sistemi operativi "moderni" - cioè sia Windows che Linux)
Pascal MARTIN

Questa è un'ottima risposta, dove posso trovare maggiori dettagli su come funziona PHP? Qualche buon libro per questo?
Kevin Boyd,

1
Non lo so davvero: immagino che leggere il manuale, leggere articoli in rete, domande / risposte qua e là e lavorare con PHP per diversi anni siano un bel modo per imparare, ma posso " Non consiglio davvero qualsiasi libro che spieghi esattamente come funziona PHP ;; ci sono alcune informazioni in "Estendere e incorporare PHP", ma il suo oggetto non è spiegare come funziona PHP ;; forse php.net/manual/en/internals2.php può aiutare?
Pascal MARTIN

Perfezione ! Mi ha aiutato molto!
zookastos

21

Se 2 client chiamano il server contemporaneamente, è molto probabile che il server sia in grado di rispondere a entrambi i client quasi contemporaneamente. I client qui li definisco a livello di browser.

Significa dire che sulla stessa macchina, se stai usando 2 browser per caricare lo stesso sito / pagina allo stesso tempo, entrambi dovrebbero essere caricati allo stesso tempo.

tuttavia, poiché stiamo parlando di PHP, è necessario prendere appunti speciali sulle sessioni. Se le tue pagine utilizzano sessioni, il server serve solo una pagina alla volta. Questo perché il file di sessione sarà bloccato fino a quando uno script non sarà terminato.

Guarda questo esempio. I 2 file vengono caricati dalla stessa sessione ovvero lo stesso browser stesso utente.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Si noti che scriptb.php viene avviato solo dopo che è stato servito scripta.php. questo perché quando scripta.php viene avviato, il file di sessione è bloccato su altri script in modo che scripta.php possa scrivere nel file di sessione. Quando scripta.php viene completato, il file di sessione viene sbloccato e quindi altri script possono utilizzarlo. Quindi scriptb.php aspetterà fino a quando il file di sessione viene liberato, quindi bloccherà il file di sessione e lo utilizzerà.

Questo processo continuerà a ripetersi per evitare che più script vengano scritti nello stesso file di sessione causando ritardi. Quindi si consiglia di chiamare session_write_close() quando non si utilizza più la sessione, specialmente su un sito Web che utilizza molti iframe o AJAX.


4

Mi sono imbattuto in questo io stesso. Fondamentalmente è necessario chiamare session_write_close()per evitare il blocco di un singolo utente. Assicurati di session_write_close()non provare a modificare le variabili di sessione una volta chiamato . Una volta che lo chiami, considera le sessioni come di sola lettura da quel momento in poi.


3

A meno che tu non stia eseguendo una configurazione molto non standard, il tuo server web (Apache, IIS, nginx, ecc.) Avrà più processi che eseguono PHP separatamente per ogni richiesta che arriva al server. Le richieste simultanee verranno soddisfatte simultaneamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.