Contenu
- 1 Tout pour bien sélectionner la version du module pour PHP
Tout pour bien sélectionner la version du module pour PHP
Le contexte technique fondamental en HTTP
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, le serveur web va créer/dédier un thread unique pour chaque requête entrante. Le serveur web Apache HTTP supporte de multiples modèles pour traiter les requêtes, dont l’un (appelé MPM ouvrier) utilise des threads. Mais il supporte un autre modèle de simultanéité appelé MPM prefork qui utilise des processus — c’est-à-dire que le serveur web créera/dédiera un seul processus pour chaque requête.
Il existe également d’autres modèles de concurrence complètement différents (utilisant des connecteurs asynchrones et des E/S), ainsi que d’autres qui combinent deux ou même trois modèles. Pour répondre à cette question, nous ne nous intéressons qu’aux deux modèles ci-dessus, en prenant l’exemple du serveur HTTP Apache.
Connaissance nécessaire sur la façon dont PHP « s’intègre » avec les 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 vers PHP pour traitement, puis nous recevons le résultat et le renvoyons à l’utilisateur. Il y a 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é comme un module pour le serveur web, et donc il est chargé directement à 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’aviez peut-être pas besoin de comprendre ces détails auparavant, parce que les sociétés d’hébergement et les distributions GNU/Linux viennent avec tout ce qui est préparé pour nous.
Maintenant, quelle différence entre Thread Safe et non Thread Safe?!
Comme avec mod_php, PHP est chargé directement dans Apache, si Apache va gérer la simultanéité en utilisant son Worker MPM (c’est-à-dire, en utilisant Threads) alors PHP doit être capable d’opérer dans ce même environnement multi-thread — ce qui veut dire que PHP doit être thread-safe pour pouvoir jouer correctement avec Apache!
A ce stade, vous devriez penser « OK, donc si j’utilise un serveur web multi-threadé et que je vais intégrer PHP directement, alors je dois utiliser la version thread-safe de PHP ». Et ce serait une bonne idée. Cependant, il se trouve que la sécurité des threads de PHP est très contestée. C’est un terrain d’utilisation pour les initiés, si vous savez vraiment ce que vous faites.
Conclusion
Quand votre PHP est installé en CGI ou FastCGI, utilisez le Non Thread Safe, si c’est installé en tant que Module Apache, utilisez le Thread Safe
Au cas où vous vous poseriez la question, mon conseil personnel serait de ne pas utiliser PHP dans un environnement multi-threads si vous avez le choix!
Parlant seulement des environnements Unix, je dirais que heureusement, vous n’avez qu’ à penser à cela si vous allez utiliser PHP avec le serveur web Apache, auquel cas il vous est conseillé d’aller avec le MPM de préfork d’Apache (qui n’utilise pas de threads, et donc, thread-safe n’a pas d’importance) et toutes les distributions GNU/Linux que je connais prendront cette décision pour vous quand vous êtes 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 allez voir comment utiliser FastCGI ou quelque chose d’égal qui fonctionne dans un modèle différent où PHP est totalement en dehors du serveur web avec plusieurs processus PHP utilisés pour répondre aux demandes à travers par exemple FastCGI. Dans ce cas, la sécurité des fils n’ a pas d’importance.
Quelles différences en thread safe et non thread safe?
Thread safe
La sécurité des threads est utilisée pour éviter les conflits lorsque des données partagées sont manipulées par différents threads. Elle est particulièrement importante lorsque des threads sont utilisés pour gérer des requêtes sur un serveur Web. Les versions « Thread Safe » permettent aux fichiers binaires de fonctionner correctement dans un environnement de serveur Web multi-thread en créant une copie locale de stockage pour chaque thread, ainsi les données ne se heurtent pas à un autre thread. En général lorsque PHP est installé en tant que module de Apache (vous le savez car vous touchez au fichier httpd.conf)
dans le contexte du multithreading, on doit garantir que différents threads ne touchent pas indépendemment aux données, ce qui mettrait sens dessus dessous les données. Par exemple un client A peut commander et payer le total du client B si ce n’est pas fait correctement.
Non thread safe
Les versions « non-thread safe » ne garantissent pas la sécurité des threads, ce qui les rend plus rapides à exécuter mais plus instables et sujettes aux blocages fréquents. Ces versions ne prennent en compte qu’un seul thread. Les fichiers binaires « non-thread safe » sont souvent utilisés lorsqu’il n’y a pas de besoin d’utiliser le multi-threading, comme dans le cas d’une interaction avec un serveur Web via le protocole FastCGI. Donc quand vous voyez fast CGI, c’est du non thread safe.
Comment savoir si PHP est installé en CGI ou en Module?
Pour voir quelle version de votre site web utilise, mettez un fichier contenant <? php phpinfo ();? > sur votre site et recherchez l’entrée API du serveur. 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é du theading n’ a pas d’importance, quelle version devez-vous utiliser — Thread Safe ou Non Thread Safe? Je suppose que la version non-thread-safe est plus rapide et moins buggy, ou sinon ils auraient juste offert la version thread-safe et ne se seraient pas donné la peine de proposer ces deux alternatives !
Supplément
Comment savoir si son installation php est Thread Safe ou non Thread Safe?
sur Linux $ php -i | grep Thread Sur Windows $ php -i | find "Thread"