Cosa è thread-safe o non-thread-safe in PHP?


774

Ho visto diversi binari per PHP, come non thread o thread safe?

Cosa significa questo?

Qual è la differenza tra questi pacchetti?


18
Puoi leggere la sicurezza dei thread su en.wikipedia.org/wiki/Thread_safety Per quanto riguarda PHP: PHP è thread-safe non credere alle bugie: PHP non è thread-safe ma la differenza tra binari PHP thread safe e non thread thread There sono disponibili molte risorse. Cerca qui su StackOverflow o Google.
TigerTiger,

Risposte:


668

Background necessario sugli approcci di concorrenza:

Diversi server Web implementano diverse tecniche per gestire le richieste HTTP in entrata in parallelo. Una tecnica piuttosto popolare sta usando i thread, ovvero il web server creerà / dedicherà un singolo thread per ogni richiesta in arrivo. Il server Web HTTP Apache supporta più modelli per la gestione delle richieste, uno dei quali (chiamato worker MPM) utilizza thread. Ma supporta un altro modello di concorrenza chiamato prefork MPM che utilizza i processi, ovvero il server Web creerà / dedicherà un singolo processo per ogni richiesta.

Esistono anche altri modelli di concorrenza completamente diversi (che utilizzano socket e I / O asincroni), oltre a quelli che mescolano due o anche tre modelli insieme. Allo scopo di rispondere a questa domanda, ci occupiamo solo dei due modelli precedenti e prendiamo ad esempio il server HTTP Apache.

Informazioni necessarie su come PHP "si integra" con i server Web:

PHP stesso non risponde alle effettive richieste HTTP: questo è il lavoro del server web. Quindi configuriamo il web server per inoltrare le richieste a PHP per l'elaborazione, quindi riceviamo il risultato e lo rispediamo all'utente. Esistono diversi modi per concatenare il server Web con PHP. Per Apache HTTP Server, il più popolare è "mod_php". Questo modulo è in realtà PHP stesso, ma compilato come modulo per il server Web e quindi viene caricato proprio al suo interno.

Esistono altri metodi per concatenare PHP con Apache e altri server Web, ma mod_php è il più popolare e servirà anche per rispondere alla tua domanda.

Potresti non aver bisogno di capire questi dettagli prima, perché le società di hosting e le distribuzioni GNU / Linux vengono fornite con tutto ciò che è preparato per noi.

Ora, sulla tua domanda!

Dal momento che con mod_php, PHP viene caricato direttamente in Apache, se Apache gestirà la concorrenza usando il suo MPM di lavoro (ovvero utilizzando i thread), PHP deve essere in grado di operare all'interno di questo stesso ambiente multi-thread, il che significa che PHP deve essere thread-safe per poter giocare correttamente la palla con Apache!

A questo punto, dovresti pensare "OK, quindi se sto usando un web server multi-thread e ho intenzione di incorporare PHP in esso, allora devo usare la versione thread-safe di PHP". E questo sarebbe un pensiero corretto. Tuttavia, come accade, la sicurezza dei thread di PHP è fortemente contestata . È una terra da usare se tu davvero sai davvero cosa stai facendo.

Note finali

Nel caso ti stia chiedendo, il mio consiglio personale sarebbe di non usare PHP in un ambiente multi-thread se hai la scelta!

Parlando solo di ambienti basati su Unix, direi che per fortuna, devi pensarci solo se intendi utilizzare PHP con il web server Apache, nel qual caso ti viene consigliato di utilizzare il prefork MPM di Apache (che non usa i thread, e quindi la sicurezza dei thread di PHP non ha importanza) e tutte le distribuzioni GNU / Linux che conosco prenderanno quella decisione quando installerai Apache + PHP attraverso il loro sistema di pacchetti, senza nemmeno chiederti per una scelta. Se utilizzerai altri server web come nginx o lighttpd , non avrai comunque la possibilità di incorporare PHP in essi. Vedrai l'utilizzo di FastCGI o qualcosa di uguale che funziona in un modello diverso in cui PHP è totalmente fuoridel server Web con più processi PHP utilizzati per rispondere alle richieste tramite ad es. FastCGI. In questi casi, anche la sicurezza del thread non ha importanza. Per vedere quale versione utilizza il tuo sito Web, inserisci un file contenente <?php phpinfo(); ?>sul tuo sito e cerca la Server APIvoce. Questo potrebbe dire qualcosa come CGI/FastCGIo Apache 2.0 Handler.

Se guardi anche la versione da riga di comando di PHP, la sicurezza del thread non ha importanza.

Infine, se la sicurezza dei thread non ha importanza, quindi quale versione dovresti usare: thread-safe o non-thread-safe? Francamente, non ho una risposta scientifica! Ma immagino che la versione non thread-safe sia più veloce e / o meno buggy, altrimenti avrebbero semplicemente offerto la versione thread-safe e non si sarebbero preoccupati di darci la scelta!


2
Quindi PHP-FPM non è threadato? Ciò risolve quindi il problema poiché Fast CGI viene utilizzato sui server nginx.
Xeoncross,

41
Dettagli fantastici, ho programmato in PHP per anni e non l'ho mai saputo.
Patrick,

1
@Xeoncross: generalmente è corretto, e in pratica è uno dei grandi motivi per gestire i processi PHP al di fuori di Apache. Ricopro questo aspetto nella mia risposta.
JM Becker,

L'unico problema qui è che PHP-FPM non è disponibile in Windows. Almeno come build nativa.
Denis V,

9
La sicurezza dei thread di PHP è ancora "fortemente contestata" (nel 2015 e nella versione 7)?
Altiano Gerung,

261

Per me, scelgo sempre la versione non thread-safe perché uso sempre nginx o eseguo PHP dalla riga di comando.

La versione non thread-safe dovrebbe essere utilizzata se si installa PHP come binario CGI, interfaccia a riga di comando o altro ambiente in cui viene utilizzato un solo thread.

Una versione thread-safe dovrebbe essere utilizzata se si installa PHP come modulo Apache in un MPM di lavoro (modello multi-elaborazione) o in un altro ambiente in cui più thread PHP vengono eseguiti contemporaneamente.


1
greg la tua risposta dovrebbe essere stata: "Se vuoi installare PHP come modulo Apache dove worker è l'MPM dovrebbe essere usata una versione di Thread Safe"
wlf

9
così php che venire con xampp su windows è NTS o TS?
Abudayah

1
Cosa succede se si utilizza il server Web incorporato PHP? Quale variante di PHP utilizzare per prestazioni ottimali?
Ariod,

1
@Dario Penso che sia solo Windows.
Greg

1
@ChristopherShaw amico, la risposta contiene SOLO parere. Non esiste alcun motivo o motivo per cui utilizzare ZTS in combinazione con un modulo Apache. Non è una risposta valida. Anche 217 ppl possono sbagliare m8.
Daniel W.

30

Apache MPM prefork con modphp è usato perché è facile da configurare / installare. Per quanto riguarda le prestazioni, è abbastanza inefficiente. Il mio modo preferito per fare lo stack, FastCGI / PHP-FPM. In questo modo è possibile utilizzare il lavoratore MPM molto più veloce. L'intero PHP rimane senza thread, ma Apache serve thread (come dovrebbe).

Quindi in pratica, dal basso verso l'alto

Linux

Apache + MPM Worker + ModFastCGI (NON FCGI) | (o) | Cherokee | (o) | nginx

PHP-FPM + APC

ModFCGI non supporta correttamente PHP-FPM o altre applicazioni FastCGI esterne. Supporta solo script FastCGI gestiti non di processo. PHP-FPM è il gestore processi FastPGI di PHP.


21

Secondo la documentazione PHP ,

Cosa significa sicurezza del thread quando si scarica PHP?

Thread Safety significa che il binario può funzionare in un contesto di server Web multithread, come Apache 2 su Windows. Thread Safety funziona creando una copia di archiviazione locale in ogni thread, in modo che i dati non si scontrino con un altro thread.

Quindi cosa scelgo? Se scegli di eseguire PHP come binario CGI, non avrai bisogno della sicurezza dei thread, perché il binario viene invocato ad ogni richiesta. Per i server Web multithread, come IIS5 e IIS6, è necessario utilizzare la versione thread di PHP.

Le seguenti librerie non sono thread-safe. Non sono raccomandati per l'uso in un ambiente multi-thread.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
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.