889 votes

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

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

Qu'est-ce que cela signifie ?

Quelle est la différence entre ces paquets ?

23 votes

Vous pouvez consulter la rubrique Sécurité des fils sur fr.wikipedia.org/wiki/Thread_safety En ce qui concerne PHP : PHP est-il thread-safe ? Ne croyez pas les mensonges : PHP n'est pas encore Thread-Safe Différence entre PHP thread safe et non thread safe binarie Il existe de nombreuses ressources disponibles. Cherchez ici sur Stackoverflow ou sur Google.

745voto

Amr Mostafa Points 5751

Besoin de connaissances sur les approches de la concurrence :

Les différents serveurs web mettent en œuvre différentes techniques pour traiter les demandes HTTP entrantes en parallèle. Une technique assez populaire est l'utilisation de threads -- c'est-à-dire que le serveur web créera/dédiera un seul thread pour chaque requête entrante. Le serveur web Apache HTTP prend en charge plusieurs modèles de traitement des demandes, dont l'un (appelé worker MPM) utilise des threads. Mais il prend en charge un autre modèle de concurrence appelé prefork MPM qui utilise des processus -- c'est-à-dire que le serveur Web crée/dédiate un seul processus pour chaque demande.

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

Besoin d'informations sur la façon dont PHP "s'intègre" aux serveurs web :

PHP lui-même ne répond pas aux requêtes HTTP - c'est le travail du serveur web. Nous configurons donc le serveur web pour qu'il transmette les requêtes à PHP pour traitement, puis qu'il reçoive le résultat et le renvoie à l'utilisateur. Il existe de multiples façons de chaîner le serveur web avec PHP. Pour le serveur HTTP Apache, la plus populaire est "mod_php". Ce module est en fait PHP lui-même, mais compilé en tant que module pour le serveur web, et il est donc chargé à l'intérieur de celui-ci.

Il existe d'autres méthodes pour enchaî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, parlons de votre question !

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

À ce stade, vous devriez vous dire : "OK, si j'utilise un serveur web multithread et que j'y intègre PHP, alors je dois utiliser la version thread-safe de PHP". Et ce raisonnement est correct. Cependant, il se trouve que la sécurité thread de PHP est très contestée . C'est un terrain à utiliser si l'on sait vraiment ce que l'on fait.

Notes finales

Au cas où vous vous poseriez la question, mon conseil personnel serait de pas Utilisez PHP dans un environnement multithread si vous avez le choix !

En parlant uniquement des environnements Unix, je dirais qu'heureusement, vous n'avez à y penser que si vous utilisez PHP avec le serveur web Apache, auquel cas il vous est conseillé d'utiliser le MPM prefork d'Apache (qui n'utilise pas de threads, et donc, la thread-safety de 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 paquets, sans même vous demander de choisir. Si vous utilisez d'autres serveurs web tels que nginx o lighttpd vous n'aurez pas la possibilité d'y intégrer PHP de toute façon. Vous devrez utiliser FastCGI ou quelque chose d'équivalent qui fonctionne dans un modèle différent où PHP est totalement à l'extérieur de du serveur web avec plusieurs processus PHP utilisés pour répondre aux requêtes par le biais, par exemple, de FastCGI. Dans ce cas, le thread-safety n'a pas d'importance. Pour savoir quelle version votre site web utilise, mettez un fichier contenant <?php phpinfo(); ?> sur votre site et cherchez le Server API l'entrée. Cela pourrait dire quelque chose comme CGI/FastCGI o Apache 2.0 Handler .

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

Enfin, si la sécurité des fils n'a pas d'importance, quelle version devriez-vous utiliser, celle qui est sûre pour les fils ou celle qui ne l'est pas ? 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 simplement proposé la version thread-safe sans se soucier de nous donner le choix !

2 votes

Donc PHP-FPM n'est pas threadé ? Cela résout donc le problème puisque Fast CGI est utilisé sur les serveurs nginx.

56 votes

Un détail génial, je programme en PHP depuis des années et je ne le savais pas.

1 votes

@Xeoncross : Généralement, c'est correct, et en pratique, c'est l'une des grandes raisons de gérer les processus PHP en dehors d'Apache. Je passe en revue cet aspect dans ma réponse.

307voto

Greg Points 8483

Pour moi, Je choisis toujours un produit non filiforme car j'utilise toujours nginx, ou j'exécute PHP en 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 tout 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 (multi-processing model) ou un autre environnement où plusieurs threads PHP s'exécutent simultanément.

1 votes

Greg, ta réponse aurait dû être : "Une version Thread Safe doit être utilisée si vous voulez installer PHP comme un module Apache où worker est le MPM".

15 votes

Donc, le php qui vient avec xampp sur Windows est NTS ou TS ?

1 votes

Et si vous utilisez le serveur web intégré de PHP ? Quelle variante de PHP utiliser pour des performances optimales ?

30voto

TechZilla Points 960

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

Donc en gros, de bas en haut

Linux

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

PHP-FPM + APC

ModFCGI ne supporte pas correctement PHP-FPM, ou toute autre application FastCGI externe. Il ne supporte que les scripts FastCGI non gérés par processus. PHP-FPM est le gestionnaire de processus FastCGI de PHP.

24voto

Somnath Muluk Points 10173

Conformément à Documentation PHP ,

Que signifie "thread safety" lors du téléchargement de PHP ?

Thread Safety signifie que le binaire peut fonctionner dans un serveur web multithreadé tel qu'Apache 2 sous Windows. Thread Safety fonctionne en créant une copie de stockage locale dans chaque thread, afin que les données n'entrent pas en collision avec un autre thread.

Alors, que dois-je choisir ? Si vous choisissez d'exécuter PHP en tant que binaire CGI, alors vous n'aurez pas besoin de la sécurité des threads, car le binaire est invoqué à chaque requête. Pour les serveurs web multithreads, comme IIS5 et IIS6, vous devriez vous devez utiliser la version threadée de PHP.

Les bibliothèques suivantes ne sont pas thread safe. Il n'est pas recommandé de les utiliser dans un environnement multithread.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win/Unix)
  • Sybase-CT (Linux, libc5)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X