web-dev-qa-db-fra.com

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

J'ai vu différents fichiers binaires pour PHP, comme non-thread ou thread safe? Qu'est-ce que ça veut dire? Quelle est la différence entre ces forfaits?

726
O..

Expérience nécessaire sur les approches de concurrence:

Différents serveurs Web implémentent différentes techniques pour gérer les demandes HTTP entrantes en parallèle. Une technique assez populaire consiste à utiliser des threads - le serveur Web crée/dédie un seul thread pour chaque requête entrante. Le serveur Web HTTP Apache prend en charge plusieurs modèles de traitement des demandes, dont l'un (appelé le MPM travailleur) utilise des threads. Mais il prend en charge un autre modèle de simultanéité appelé prefork MPM qui utilise des processus. En d'autres termes, le serveur Web crée/dédie un processus unique pour chaque demande.

Il existe également d'autres modèles de concurrence complètement différents (utilisant des sockets asynchrones et des E/S), ainsi que des modèles combinant deux, voire trois modèles. Afin de répondre à cette question, nous ne nous intéressons qu'aux deux modèles ci-dessus, et prenons l'exemple du serveur HTTP Apache.

Fond nécessaire sur la manière 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 avons donc configuré le serveur Web pour qu'il transfère les demandes à PHP pour traitement, puis recevions le résultat et le renvoyions à 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 et est donc chargé directement à l'intérieur de celui-ci.

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’aviez peut-être pas besoin de comprendre ces détails auparavant, car les sociétés d’hébergement et les distributions GNU/Linux ont tout préparé pour nous.

Maintenant, sur votre question!

Depuis avec mod_php, PHP est chargé directement dans Apache, si Apache doit gérer la concurrence d'accès à l'aide de son Worker MPM (c'est-à-dire à l'aide de Threads), alors PHP doit pouvoir fonctionner dans ce contexte. même environnement multi-thread - ce qui signifie 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 multi-thread et que je vais y intégrer PHP, 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 controversée . C'est un terrain d'utilisation, si vous savez vraiment ce que vous faites.

Notes finales

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

En parlant uniquement des environnements basés sur Unix, je dirais que heureusement, vous n’y penserez que si vous voulez utiliser PHP avec le serveur Web Apache. Dans ce cas, il est conseillé d’utiliser la prefork MPM d'Apache (qui n'utilise pas de threads, et donc PHP la sécurité des threads n'a pas d'importance) et toutes les distributions GNU/Linux que je connais prendront cette décision pour vous lors de l'installation 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 ou lighttpd , vous n'aurez de toute façon pas la possibilité d'y intégrer PHP. Vous chercherez à utiliser 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 PHP processus utilisés pour répondre aux demandes, par exemple FastCGI. Dans de tels cas, la sécurité du fil n'a pas d'importance non plus. Pour voir quelle version votre site Web utilise, mettez 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 é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 - 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 boguée, sinon ils auraient simplement proposé la version thread-safe sans se soucier de nous donner le choix!

637
Amr Mostafa

Pour moi, je choisis toujours de non-thread-safe version parce que j'utilise toujours nginx, ou que je lance PHP depuis 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 dans lequel un seul thread est utilisé.

Vous devez utiliser une version thread-safe si vous installez PHP en tant que module Apache dans un MPM (modèle de traitement multitraitement) worker ou dans un autre environnement où plusieurs PHP threads s'exécutent simultanément.

253
Greg

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. L'ensemble PHP reste non-threadé, mais Apache sert des threads (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, ni aucune application FastCGI externe. Il ne prend en charge que les scripts FastCGI non gérés par processus. PHP-FPM est le PHP gestionnaire de processus FastCGI.

29
J. M. Becker

Selon documentation PHP ,

Que signifie 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, tel qu'Apache 2 sous Windows. La sécurité des threads consiste à créer 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 sécurité de thread, car le binaire est appelé à chaque demande. Pour les serveurs Web multithreads, tels que IIS5 et IIS6, vous devez utiliser la version threadé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)
21
Somnath Muluk