2009-03-25 11 views
46
  • PHP (a partire da 5.2) thread-safe su Linux/UNIX?
  • Sarebbe possibile utilizzarlo con Apache Worker-MPM o Event-MPM?

I fatti che ho raccolto finora sono inconcludenti: binariPHP è thread-safe?

  • default incluso in molte distribuzioni hanno ZTS disabile, quindi sono a conoscenza, che avrei dovuto ricompilare loro.
  • In teoria Zend Engine (core PHP) con ZTS abilitato è thread-safe.
  • Si dice che alcuni moduli potrebbero non essere thread-safe, ma non ho trovato alcun elenco di moduli che sono o non lo sono.
  • PHP FAQ dichiara praticamente come sopra.

Qual è la vostra esperienza?

Non si tratta solo di segmentation faults ("violazione di accesso" nella nomenclatura di Windows). C'è molto di più a thread safety.

+1

Mentre questo è un argomento caldo, è una buona domanda. Qualcosa o è, o non è thread-safe .. 'da qualche parte nel mezzo' è un buon argomento per discutere qui. –

+0

Vedere avviso PHP ufficiale: "* [Non è consigliabile utilizzare un MPM con thread in produzione con Apache 2] (http://web.archive.org/web/20160412170643/http://www.php.net/manual/ it/install.unix.apache2.php) *". Anche correlati: http://web.archive.org/web/20160412171006/https://docs.newrelic.com/docs/agents/php-agent/troubleshooting/threaded-apache-worker-mpms – Pacerier

risposta

20

So che gettext e set_locale non sono thread-safe. PHP non dovrebbe essere usato con un MPM filettato.

PHP Isn't Thread-Safe Yet.
Running PHP not threaded.

+0

Sì, ho leggi quell'articolo prima. Ma non dà molti fatti. Anche segfaults (o "violazione di accesso") non ha molto a che fare con la sicurezza dei thread. – vartec

+2

Sì, lo fanno. Se i segfault sono dovuti a violazioni di accesso alla memoria dovute a un accesso filettato non corretto alle variabili condivise, questo è esattamente il problema che si desidera evitare. Non * riguarda solo le violazioni di accesso/segfault, ma se fa segfault, non preoccuparti di cercare ulteriormente perché non è sicuramente thread-safe. –

+0

Sì.Sto usando nginx con php-fpm perché gettext non è thread-safe: http://stackoverflow.com/questions/1646249/php-gettext-problems-like-non-thread-safe/6726570#6726570 – Stann

5

Una domanda migliore potrebbe essere: "Il seguente codice PHP causerà violazioni di accesso se viene utilizzato MPM?" Oppure, "Hai riscontrato comportamenti strani probabilmente attribuiti a problemi di concorrenza utilizzando le seguenti funzioni?"

Altrimenti, è la roulette russa. Se stai usando un'applicazione pacchettizzata, potrebbe funzionare bene ora, ma si rompa un mese da quando viene fuori una nuova versione dell'applicazione.

Mi sconsiglio vivamente di utilizzare MPM con PHP in generale. Tuttavia, se hai un codice piccolo da eseguire, puoi pubblicarlo e potremmo dirti se stai per colpire una trappola.

+2

potrebbe non essere thread-safe e non causare mai alcuna violazione di segfault/accesso. – vartec

+0

@vartec, sì, ho modificato la mia risposta. –

+1

@TimPost, non capisco perché dici che è "roulette russa". Se il codice è effettivamente thread-safe, allora sarà sicuro usare ** indipendentemente ** da quanti thread simultanei lo chiamano. Anche se sei sfortunato alla "roulette russa" (suppongo che tu intenda i thread concomitanti interfogli ad ogni passo e in tutti i peggiori posti possibili), è comunque sicuro che il codice sia sicuro per i thread e non avremmo un segfault . – Pacerier

6

Vedere Where can I get libraries needed to compile some of the optional PHP extensions? per un elenco di estensioni thread-safe e nonthread-safe (* contrassegnati non sono thread-safe e altri lo sono).

+0

Questo elenco funziona per le estensioni, ma non elenca le caratteristiche non sicure del thread di ** non ** - estensioni. E.g ['setlocale'] (http://php.net/manual/en/function.setlocale.php#refsect1-function.setlocale-note) come menzionato da userOIS sopra. – Pacerier