Qu'est-ce qui est thread-safe ou non-thread safe en PHP?

775

J'ai vu différents binaires pour PHP, comme non-thread ou thread-safe?

Qu'est-ce que ça veut dire?

Quelle est la différence entre ces packages?

O ..
la source
18
Vous pouvez lire à propos de la sécurité sur Enfilez en.wikipedia.org/wiki/Thread_safety En ce qui concerne PHP: est thread-safe PHP Do not Believe The Lies: PHP est pas thread-safe Cependant , la différence entre la sécurité de fil PHP et non fil binarie sécurité Il sont de nombreuses ressources disponibles. Recherchez ici sur Stackoverflow ou Google.
TigerTiger

Réponses:

669

Contexte nécessaire sur les approches de concurrence:

Différents serveurs Web mettent en œuvre différentes techniques pour gérer les demandes HTTP entrantes en parallèle. Une technique assez populaire utilise des threads - c'est-à-dire que le serveur Web créera / dédiera un seul thread pour chaque demande entrante. Le serveur Web Apache HTTP prend en charge plusieurs modèles de gestion des demandes, dont l'un (appelé MPM de travail) utilise des threads. Mais il prend en charge un autre modèle de concurrence appelé le MPM préfork qui utilise des processus - c'est-à-dire que le serveur Web créera / dédiera un seul processus pour chaque demande.

Il existe également d'autres modèles de concurrence d'accès complètement différents (utilisant des sockets asynchrones et des E / S), ainsi que des modèles qui mélangent deux, voire trois modèles. Dans le but de répondre à cette question, nous ne nous intéressons qu'aux deux modèles ci-dessus, et en prenant le serveur Apache HTTP comme exemple.

Contexte nécessaire sur la façon dont PHP "s'intègre" aux serveurs Web:

PHP lui-même ne répond pas aux requêtes HTTP réelles - c'est le travail du serveur Web. Nous configurons donc le serveur Web pour transmettre les requêtes à PHP pour traitement, puis recevons le résultat et le renvoyons à l'utilisateur. Il existe plusieurs façons de chaîner le serveur Web avec PHP. Pour Apache HTTP Server, le plus populaire est "mod_php". Ce module est en fait PHP lui-même, mais compilé en tant que module pour le serveur Web, il est donc chargé directement à l'intérieur.

Il existe d'autres méthodes pour chaîner PHP avec Apache et d'autres serveurs Web, mais mod_php est la plus populaire et servira également à répondre à votre question.

Vous n'avez peut-être pas eu besoin de comprendre ces détails auparavant, car les sociétés d'hébergement et les distributions GNU / Linux sont livrées avec tout ce qui est préparé pour nous.

Maintenant, à votre question!

Comme avec mod_php, PHP est chargé directement dans Apache, si Apache va gérer la concurrence en utilisant son Worker MPM (c'est-à-dire, en utilisant Threads), alors PHP doit pouvoir fonctionner dans ce même environnement multi-thread - ce qui signifie que PHP doit être thread-safe pour pouvoir jouer correctement avec Apache!

À ce stade, vous devriez penser "OK, donc si j'utilise un serveur Web multithread et que je vais intégrer PHP directement dedans, alors je dois utiliser la version thread-safe de PHP". Et ce serait une pensée correcte. Cependant, il se trouve que la sécurité des threads de PHP est très contestée . C'est un terrain à utiliser si vous savez vraiment ce que vous faites.

Notes finales

Au cas où vous vous poseriez la question, mon conseil personnel serait de ne pas utiliser PHP dans un environnement multi-thread si vous avez le choix!

En parlant uniquement des environnements basés sur Unix, je dirais que, heureusement, vous ne devez y penser que si vous allez utiliser PHP avec le serveur Web Apache, auquel cas il est conseillé d'utiliser le MPM préfork d'Apache (qui n'utilise pas de threads, et par conséquent, la sécurité des threads PHP n'a pas d'importance) et toutes les distributions GNU / Linux que je connais prendront cette décision pour vous lorsque vous installerez Apache + PHP via leur système de package, sans même vous le demander pour un choix. Si vous comptez utiliser d'autres serveurs Web tels que nginx ou lighttpd , vous n'aurez de toute façon pas la possibilité d'y intégrer PHP. Vous envisagerez d'utiliser FastCGI ou quelque chose d'égal qui fonctionne dans un modèle différent où PHP est totalement extérieurdu serveur Web avec plusieurs processus PHP utilisés pour répondre aux demandes via par exemple FastCGI. Dans de tels cas, la sécurité des threads n'a pas d'importance non plus. Pour voir quelle version votre site Web utilise, placez un fichier contenant <?php phpinfo(); ?>sur votre site et recherchez l' Server APIentrée. Cela pourrait dire quelque chose comme CGI/FastCGIou Apache 2.0 Handler.

Si vous regardez également la version en ligne de commande de PHP, la sécurité des threads n'a pas d'importance.

Enfin, si la sécurité des threads n'a pas d'importance, quelle version devez-vous utiliser - la thread-safe ou la non-thread-safe? Franchement, je n'ai pas de réponse scientifique! Mais je suppose que la version non thread-safe est plus rapide et / ou moins boguée, sinon ils auraient juste proposé la version thread-safe et ne se seraient pas donné la peine de nous donner le choix!

Amr Mostafa
la source
2
Donc PHP-FPM n'est pas fileté? Cela résout alors le problème puisque Fast CGI est utilisé sur les serveurs nginx.
Xeoncross
41
Détail impressionnant, je programme en PHP depuis des années et je ne l'ai jamais su.
Patrick
1
@Xeoncross: En général, c'est correct, et dans la pratique, c'est l'une des bonnes raisons de gérer les processus PHP en dehors d'Apache. J'examine cet aspect dans ma réponse.
JM Becker
Le seul problème ici est que PHP-FPM n'est pas disponible sous Windows. Au moins en tant que version native.
Denis V
9
La sécurité des threads de PHP est-elle toujours "très contestée" (en 2015 et en version 7)?
Altiano Gerung
261

Pour moi, je choisis toujours une version non thread-safe car j'utilise toujours nginx, ou j'exécute PHP à partir de la ligne de commande.

La version non thread-safe doit être utilisée si vous installez PHP en tant que binaire CGI, interface de ligne de commande ou autre environnement où un seul thread est utilisé.

Une version thread-safe doit être utilisée si vous installez PHP en tant que module Apache dans un MPM de travail (modèle multi-traitement) ou un autre environnement où plusieurs threads PHP s'exécutent simultanément.

Greg
la source
1
greg votre réponse aurait dû être: "Une version Thread Safe devrait être utilisée si vous souhaitez installer PHP comme module Apache où le travailleur est le MPM"
wlf
9
donc php qui vient avec xampp sur windows est NTS ou TS?
Abudayah du
1
Et si vous utilisez un serveur Web intégré PHP? Quelle variante de PHP utiliser pour des performances optimales?
Ariod
1
@Dario Je pense que c'est juste Windows.
Greg
1
@ChristopherShaw mec, la réponse contient UNIQUEMENT une opinion. Il n'y a aucune source ni raison POURQUOI utiliser ZTS en combinaison avec un module Apache. Ce n'est pas une réponse valable. Même 217 ppl peuvent être faux m8.
Daniel W.
30

Apache MPM prefork avec modphp est utilisé car il est facile à configurer / installer. En termes de performances, il est assez inefficace. Ma façon préférée de faire la pile, FastCGI / PHP-FPM. De cette façon, vous pouvez utiliser le MPM Worker beaucoup plus rapide. Le PHP entier reste non threadé, mais Apache sert le thread (comme il se doit).

Donc, fondamentalement, de bas en haut

Linux

Apache + MPM Worker + ModFastCGI (NOT FCGI) | (ou) | Cherokee | (ou) | Nginx

PHP-FPM + APC

ModFCGI ne prend pas correctement en charge PHP-FPM, ni aucune application FastCGI externe. Il prend uniquement en charge les scripts FastCGI non gérés par le processus. PHP-FPM est le gestionnaire de processus PHP FastCGI.

JM Becker
la source
21

Selon la documentation PHP ,

Que signifie la sécurité des threads lors du téléchargement de PHP?

La sécurité des threads signifie que le binaire peut fonctionner dans un contexte de serveur Web multithread, comme Apache 2 sous Windows. La sécurité des threads fonctionne en créant une copie de stockage local dans chaque thread, afin que les données ne se heurtent pas à un autre thread.

Alors qu'est-ce que je choisis? Si vous choisissez d'exécuter PHP en tant que binaire CGI, vous n'aurez pas besoin de la sécurité des threads, car le binaire est invoqué à chaque demande. Pour les serveurs Web multithreads, tels que IIS5 et IIS6, vous devez utiliser la version filetée de PHP.

Les bibliothèques suivantes ne sont pas thread-safe. Ils ne sont pas recommandés pour une utilisation dans un environnement multi-thread.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Somnath Muluk
la source