2009-09-16 23 views
78

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

  • Le richieste verranno messe in coda?
  • Verranno ignorati?
  • Ogni richiesta avrà una propria istanza di script ?
  • Qualsiasi altra possibilità?
+1

Controllare anche questa risposta: http://konrness.com/php5/how-to-prevent-blocking-php-requests/ – trante

risposta

128

Il server, a seconda della sua configurazione, può servire generalmente centinaia di richieste al tempo stesso - se si utilizza Apache, l'opzione di configurazione MaxClients è quello dicendo:

Il La direttiva MaxClients imposta il limite sul numero di richieste simultanee di che verranno pubblicate.
Qualsiasi tentativo di connessione oltre il limite MaxClients sarà in genere in coda, fino a un numero basato sulla direttiva ListenBacklog.
Una volta che un processo figlio viene liberato alla fine di una richiesta diversa , la connessione sarà quindi essere servito.


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

Quindi:

Saranno le richieste in coda?

No; a meno che:

  • c'è qualche blocco da qualche parte - che può accadere, per esempio, se le due richieste provengono dallo stesso client, e si utilizza sessioni basati su file in PHP: mentre un lo script è in esecuzione, la sessione è "bloccata", il che significa che il server/client dovrà attendere fino al 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 lo stesso browser; la maggior parte dei browser accodano le richieste in questo caso, anche quando non c'è nulla sul lato server che produce questo comportamento.
  • ci sono più di MaxClients processi attualmente attivi - vedere la citazione dal manuale di Apache poco prima.


essi saranno ignorati?

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

Se fosse il caso, non potrei pubblicare questa risposta, se tu colpissi F5 nello stesso momento per vedere se qualcuno ha risposto!
(bene, quindi non è in PHP, ma i principi sono gli stessi)


Qualsiasi altra possibilità?

Sì ^^


modifica dopo aver modificato il PO e il commento:

Will ogni richiesta di avere una propria istanza di script ?

Non esiste una cosa come "esempio sceneggiatura": In parole povere, ciò che sta accadendo in cui una richiesta a uno script viene fatta è:

  • forche il webserver un altro processo per gestire il richiesta (spesso, per motivi di prestazioni, quelle forcelle sono fatte in anticipo, ma questo non cambia nulla)
  • il processo legge lo script PHP dal disco
    • diversi processi possono fare questo contemporaneamente: non c'è blocco sul file di lettura
    • il file viene caricato in memoria; in un blocco di memoria distinto per ogni processo
  • il file PHP in memoria è "compilato" ad opcode - ancora nella memoria
  • tali codici operativi vengono eseguiti - ancora dal blocco di memoria che appartiene a il processo di rispondere alla tua richiesta


Davvero, si possono avere due utenti che inviano una richiesta per lo stesso script PHP (o script PHP peculiarità che comprendono lo stesso file PHP); questo non è sicuramente un problema, o nessuno dei siti web su cui abbia mai lavorato avrebbe funzionato!

+0

Se più richieste simultanee accedono allo stesso file php quale sarebbe il risultato. le altre richieste verranno mantenute in sospeso o ogni richiesta avrà una propria istanza di script? –

+3

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

+0

Questa è una risposta eccellente , dove potrei imparare più dettagli su come funziona PHP? Qualche buon libro per questo? –

2

A meno che non si esegua una configurazione non standard, il server Web (Apache, IIS, nginx, ecc.) Disporrà di più processi che eseguono PHP separatamente per ogni richiesta che entra nel server. Le richieste simultanee saranno servite simultaneamente.

17

Se 2 client chiamano il server allo stesso tempo, il server è probabilmente in grado di rispondere entrambi i client quasi simultaneamente. I client qui li definisco al livello del browser.

Significa dire che sulla stessa macchina, se si utilizzano 2 browser per caricare lo stesso sito Web/pagina contemporaneamente, entrambi devono essere caricati contemporaneamente.

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 verrà bloccato fino alla chiusura di uno script.

Guarda questo esempio. I 2 file vengono caricati dalla stessa sessione aka stesso browser dell'utente stesso.

 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 viene servito scripta.php. questo perché all'avvio di scripta.php, il file di sessione è bloccato su altri script in modo che scripta.php possa scrivere nel file di sessione. Al termine di scripta.php, il file di sessione è sbloccato e quindi altri script sono in grado di usarlo. Così scriptb.php attenderà che il file di sessione sia liberato, quindi bloccherà il file di sessione e lo userà.

Questo processo continuerà a essere ripetuto per evitare che più script scrivano sullo stesso file di sessione causando ritardi. Pertanto, si consiglia di chiamare session_write_close() quando non si utilizza più la sessione, in particolare su un sito Web che utilizza molti iframe o AJAX.

+0

'session_write_close()' giusto, ben fatto uomo! – TechNyquist

2

Mi sono imbattuto in questo. Fondamentalmente è necessario chiamare session_write_close() per impedire il blocco di un singolo utente. Assicurati di chiamare il numero session_write_close() ma non provare a modificare alcuna variabile di sessione. Una volta che lo chiami, tratti le sessioni come di sola lettura da quel momento in poi.

Problemi correlati