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


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 paquets?


670
2017-10-26 09:41


origine


Réponses:


Arrière-plan nécessaire sur les approches de concurrence:

Différents serveurs Web implémentent différentes techniques pour gérer les requêtes HTTP entrantes en parallèle. Une technique assez populaire utilise des threads - c'est-à-dire que le serveur web va créer / dédier un thread unique pour chaque requête entrante. Le serveur Web HTTP Apache prend en charge plusieurs modèles pour la gestion des demandes, dont l'un (appelé MPM du worker) 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 va créer / dédier un seul processus pour chaque requête.

Il existe également d'autres modèles de concurrence simultanée (utilisant des sockets asynchrones et des E / S), ainsi que des modèles mixant deux ou même trois modèles. Dans le but de répondre à cette question, nous nous intéressons uniquement aux deux modèles ci-dessus, et prenons le serveur HTTP Apache à titre d'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 réelles - c'est le travail du serveur web. Nous configurons donc le serveur web pour transférer les requêtes à PHP, puis recevoir le résultat et le renvoyer à l'utilisateur. Il y a plusieurs façons d'enchaî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, et donc il est chargé à l'intérieur.

Il existe d'autres méthodes pour enchaîner PHP avec Apache et d'autres serveurs web, mais mod_php est le plus populaire et servira aussi à répondre à votre question.

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

Maintenant, sur votre question!

Comme avec mod_php, PHP est chargé directement dans Apache, si Apache doit gérer la concurrence en utilisant son MPM Worker (c'est-à-dire en utilisant Threads) alors PHP doit pouvoir fonctionner dans ce même environnement multithread - c'est-à-dire PHP doit être thread-safe pour pouvoir jouer à la balle 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, alors je dois utiliser la version thread-safe de PHP». Et ce serait une pensée correcte. Cependant, comme il arrive, la sécurité du fil de PHP est très controversé. C'est un terrain d'utilisation-si-vous-vraiment-vraiment-savez-ce que vous faites.

Notes finales

Au cas où vous vous demandez, mon conseil personnel serait de ne pas utilisez PHP dans un environnement multithread si vous avez le choix!

Parlant uniquement des environnements basés sur Unix, je dirais que, heureusement, vous ne devez penser à cela que si vous allez utiliser PHP avec le serveur web Apache, auquel cas il vous est conseillé d'aller avec le prepk MPM d'Apache (qui n'utilise pas de threads, et donc, 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 installez Apache + PHP via leur système de paquets, sans même vous demander pour un choix. Si vous allez utiliser d'autres serveurs Web tels que nginx ou lighttpd, vous n'aurez pas la possibilité d'y intégrer PHP de toute façon. Vous regarderez en utilisant FastCGI ou quelque chose d'égal qui fonctionne dans un modèle différent où PHP est totalement à l'extérieur du serveur Web avec plusieurs processus PHP utilisés pour répondre à des demandes via, par ex. FastCGI. Dans de tels cas, la sécurité des threads n'a pas non plus d'importance. Pour voir quelle version votre site utilise, mettez un fichier contenant <?php phpinfo(); ?> sur votre site et recherchez le Server API entrée. Cela pourrait dire quelque chose comme CGI/FastCGI ou Apache 2.0 Handler.

Si vous regardez aussi 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: thread-safe ou 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 offert la version thread-safe et ne pas pris la peine de nous donner le choix!


588
2018-05-12 13:37



UNE thread-safe version devrait être utilisée si vous installez PHP en tant que Module Apache, en tant que MPM travailleur (modèle multi-traitement).

le non-thread version devrait être utilisée si vous installez PHP en tant que Binaire CGI.

Pour moi, Je choisis toujours non-thread version parce que j'utilise toujours nginx, ou exécutez PHP à partir de la ligne de commande.


233
2017-11-21 17:34



Apache MPM prefork avec modphp est utilisé car il est facile à configurer / installer. En termes de performances, c'est plutôt 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 threaded (comme il se doit).

Donc, fondamentalement, de bas en haut

Linux

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

PHP-FPM + APC

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


27
2017-07-18 17:55



Selon Documentation PHP,

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

Thread Safety signifie que binary peut fonctionner sur un serveur web multithread   contexte, tel que Apache 2 sur Windows. Thread Safety fonctionne en créant   une copie de stockage local dans chaque thread, de sorte que les données ne vont pas entrer en collision   avec un autre fil.

Alors qu'est-ce que je choisis? Si vous choisissez d'exécuter PHP en tant que binaire CGI, alors   vous n'aurez pas besoin de sécurité de thread, car le binaire est invoqué à chaque   demande. Pour les serveurs Web multithread, tels que IIS5 et IIS6, vous   devrait 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 multithread.

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

16
2017-12-14 12:21