Qu'est-ce que thread safe ou 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?
4 réponses
Nécessaire de fond sur la simultanéité des approches:
différents serveurs Web mettent en œuvre différentes techniques pour traiter les requêtes HTTP entrantes en parallèle. Une technique assez populaire est d'utiliser des threads -- c'est-à-dire que le serveur web va créer/dédier un seul thread pour chaque requête entrante. Le serveur Web HTTP Apache supporte plusieurs modèles pour traiter les requêtes, dont l'un (appelé MPM worker) utilise des threads. Mais il soutient un autre modèle de concurrence appelé le MPM De prefork qui utilise des processus -- c'est-à-dire que le serveur web va créer/dédier un processus unique pour chaque requête.
il existe aussi d'autres modèles de concurrence complètement différents (utilisant des sockets asynchrones et des e/s), ainsi que ceux qui mélangent deux ou même trois modèles ensemble. Pour répondre à cette question, nous ne nous intéressons qu'aux deux modèles ci-dessus et prenons le serveur HTTP Apache comme exemple.
besoin d'informations sur la façon dont PHP "intègre" avec des 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 recevoir le résultat et le renvoyer à l'utilisateur. Il y a plusieurs façons d'enchaîner le serveur web avec PHP. Pour le serveur HTTP Apache, le plus populaire est "mod_php". Ce module est en fait PHP lui-même, mais compilé comme un module pour le serveur web, et donc il obtient chargé de droite à l'intérieur.
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 avant, parce que les sociétés d'hébergement et GNU/Linux distros viennent avec tout ce qui est préparé pour nous.
maintenant, à votre question!
depuis avec mod_php, PHP obtient chargé directement dans Apache, si Apache va gérer la concurrence en utilisant son MPM Worker (c'est-à-dire en utilisant des Threads) alors PHP doit être capable de fonctionner dans ce même environnement multi-threadé -- ce qui signifie, PHP doit être thread-safe pour pouvoir jouer correctement avec Apache!
à ce stade, vous devriez penser " OK, donc si j'utilise un serveur web multi-threadé et que je vais intégrer PHP directement dedans, alors je dois utiliser la version thread-safe de PHP". Et ce serait la pensée correcte. Cependant, il se trouve que la sécurité du fil de PHP est très contestée . C'est un terrain d'usage si tu sais vraiment ce que tu fais.
notes finales
au cas où vous vous demandiez, mon conseil personnel serait de pas utiliser PHP dans un environnement multi-threadé si vous avez le choix!
ne parlant que des environnements Unix, je dirais heureusement, vous n'avez qu'à y penser si vous allez utiliser PHP avec Apache web server, auquel cas il vous est conseillé d'utiliser le MPM prefork D'Apache (qui n'utilise pas de threads, et donc PHP thread-safety 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 un choix. Si vous allez utiliser d'autres serveurs web tels que nginx ou lighttpd , vous n'aurez pas l'option D'y intégrer PHP de toute façon. Vous allez regarder en utilisant FastCGI ou quelque chose d'équivalent qui fonctionne dans un modèle différent où PHP est totalement en dehors de du serveur web avec plusieurs processus PHP utilisés pour répondre aux requêtes par exemple FastCGI. Dans de tels cas, la sécurité du fil n'a pas d'importance. Pour voir quelle version de votre site web utilise mettre un fichier contenant <?php phpinfo(); ?>
sur votre site et recherchez l'entrée Server API
. 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é du thread n'a pas d'importance.
enfin, si la sécurité des threads n'a pas d'importance, alors quelle version devez-vous utiliser -- le thread-safe ou le 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 buggy, ou sinon ils auraient juste offert la version thread-safe et pas la peine de nous donner le choix!
For me, I always choose non-thread safe version parce que j'utilise toujours nginx, ou exécuter 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 en ligne de commande ou autre environnement dans lequel un seul thread est utilisé.
une version thread-safe doit être utilisée si vous installez PHP comme un module Apache dans un MPM worker (multi-processing model) ou autre environnement où plusieurs threads PHP s'exécutent simultanément.
Apache MPM prefork avec modphp est utilisé car il est facile à configurer/installer. Performance sage, 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. Le PHP entier reste non-threadé, mais Apache sert threadé (comme il devrait).
donc fondamentalement, de bas en haut
Linux
Apache + MPM Worker + ModFastCGI (NOT FCGI) / (or) / Cherokee | (or) / Nginx
PHP-FPM + APC
ModFCGI ne supporte pas correctement PHP-FPM, ni aucune application externe FastCGI. Il ne supporte que les scripts FastCGI Non-process managés. PHP-FPM est le gestionnaire de processus PHP FastCGI.
selon documentation PHP ,
que signifie la sécurité du thread lors du téléchargement de PHP?
la sécurité des threads signifie que le binaire peut fonctionner dans un serveur web multithread contexte, comme Apache 2 sur Windows. La sécurité du fil fonctionne en créant une copie de stockage locale dans chaque thread, afin que les données ne se heurtent pas avec un autre thread.
alors que dois-je choisir? Si vous choisissez D'exécuter PHP comme un binaire CGI, puis vous n'aurez pas besoin de la sécurité du thread, parce que le binaire est invoqué à chaque demande. Pour les serveurs multithread, tels que IIS5 et IIS6, vous devrait utiliser la version threadée de PHP.
les bibliothèques suivantes ne sont pas sécurisées. 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)