Domanda

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

  • Le richieste verranno messe in coda?
  • Saranno ignorati?
  • Ogni richiesta avrà il suo script esempio?
  • Qualche altra possibilità?
È stato utile?

Soluzione

Il server, a seconda della sua configurazione, può generalmente servire centinaia di richieste contemporaneamente - se si utilizza Apache, MaxClients è l'opzione di configurazione che dice:

  

La direttiva MaxClients imposta il   limite al numero di simultanei   richieste che verranno servite.
Qualsiasi   tentativi di connessione tramite   Il limite MaxClients sarà normalmente   in coda, fino a un numero basato su   Direttiva ListenBacklog.
Una volta che un bambino   il processo viene liberato alla fine di a   richiesta diversa, la connessione sarà   quindi essere revisionato.


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

Quindi:

  

Le richieste verranno messe in coda?

No; tranne se:

  • 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 : durante l'esecuzione di uno script, la sessione è "bloccata", il che significa che il server / client dovrà attendere fino al termine della prima richiesta (e il file sbloccato ) per poter usa 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 sul lato server che produce questo comportamento.
  • ci sono più di MaxClients processi attualmente attivi - vedi la citazione dal manuale di Apache poco prima.

  

Saranno ignorati?

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

Se così fosse, non potrei pubblicare questa risposta, se tu colpissi 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à il suo script   esempio?

Non esiste nulla come " istanza di script " : in parole povere, ciò che sta accadendo quando viene fatta una richiesta a uno script è:

  • le forcelle del server web un altro processo per gestire la 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 farlo contemporaneamente : non è possibile bloccare la lettura dei file
    • il file viene caricato in memoria; in un blocco di memoria distinto per ciascun processo
  • il file PHP in memoria è " compilato " a codici operativi - 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 è assolutamente un problema, o nessuno dei siti Web su cui abbia mai lavorato funzionerebbe!

Altri suggerimenti

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

Significato per dire che sullo stesso computer, se si utilizzano 2 browser per caricare lo stesso sito Web / pagina contemporaneamente, entrambi devono essere caricati contemporaneamente.

tuttavia, poiché stiamo parlando di PHP, devi 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, ovvero lo stesso browser, lo stesso utente.

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

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

Nota che scriptb.php viene avviato solo dopo che scripta.php è stato pubblicato. questo perché quando scripta.php è stato 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 della sessione viene sbloccato e quindi altri script sono in grado di usarlo. Quindi scriptb.php attenderà 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 scrivano nello stesso file di sessione causando ritardi. Pertanto, 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.

Mi sono appena imbattuto in questo. Fondamentalmente è necessario chiamare session_write_close () per impedire il blocco di un singolo utente. Assicurati di aver chiamato session_write_close () ma non provi a modificare alcuna variabile di sessione. Una volta che lo chiami, tratta le sessioni come di sola lettura da allora in poi.

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 nel server. Le richieste simultanee verranno gestite contemporaneamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top