Thread Safe et Non-Thread Safe en PHP : que choisir et comment ne pas se tromper ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que thread safe ou non-thread safe en PHP ? Comprenons une fois pour toutes

\n\n

Si vous avez déjà installé PHP sur Windows ou configuré un serveur web, vous avez sûrement vu les mystérieuses abréviations TS et NTS dans les noms des distributions. Ou vous avez lu des avertissements dans la documentation : « Choisissez la version thread-safe ou non-thread-safe ». Et immédiatement la question s'est posée : « Qu'est-ce que cela signifie ? Et que se passe-t-il si je choisis la mauvaise ? »

\n\n

Cet article est votre guide dans le monde de la sécurité des threads en PHP. Nous allons comprendre en quoi les versions thread safe (TS) et non-thread safe (NTS) diffèrent, quand chacune est nécessaire, et comment éviter le piège de l'incompatibilité des extensions. C'est parti !

\n\n

L'essentiel en bref : qu'est-ce que la sécurité des threads ?

\n\n

Imaginez que PHP est un chef dans une cuisine. Et chaque requête vers votre site est une nouvelle commande. En mode non-thread safe, chaque commande est préparée par un chef séparé dans sa propre cuisine personnelle. Ils ne se gênent pas, car chacun a ses propres couteaux, casseroles et ingrédients. Pas de mémoire partagée — pas de conflits.

\n\n

En mode thread safe, vous avez un seul chef, mais il travaille avec plusieurs mains (threads). Toutes les mains partagent une seule cuisine, les mêmes outils et la même mémoire. Et le principal est de ne pas attraper le même couteau en même temps. Pour éviter cela, des verrous et une synchronisation sont nécessaires — c'est ce qu'on appelle la sécurité des threads (thread safety).

\n\n

En termes simples : Thread Safe (TS) — PHP peut fonctionner dans un environnement multithreadé, où un seul processus traite plusieurs requêtes simultanément. Non-Thread Safe (NTS) — PHP fonctionne en mode monothread, où chaque requête est un processus séparé.

\n\n

Quand et pourquoi les versions TS et NTS sont-elles apparues ?

\n\n

Historiquement, PHP s'est développé comme un module pour Apache (mod_php). Apache peut fonctionner dans deux modes : prefork (un processus par requête) et worker (un processus avec plusieurs threads). Pour prefork, la sécurité des threads n'est pas nécessaire — chaque requête est isolée. Mais pour worker, elle est critique.

\n\n

Plus tard, avec la popularité croissante de FastCGI (PHP-FPM) et de Nginx, il est devenu clair que dans ces scénarios, le multithreading au sein de PHP n'est pas utilisé. FastCGI lance des processus séparés, et chacun fonctionne indépendamment. Pourquoi alors traîner un lourd code de verrouillage ? C'est ainsi que sont apparues les versions allégées non-thread safe.

\n\n

Comment déterminer quelle version de PHP est installée ?

\n\n

La méthode la plus simple est d'exécuter dans la console ou dans un script PHP :

\n\n
<?php\nphpinfo();\n?>
\n\n

Recherchez la ligne Thread Safety. Si elle indique enabled — vous avez la version TS. Si disabled — c'est la NTS.

\n\n

La deuxième méthode consiste à regarder la sortie de la commande php -i | findstr "Thread" (Windows) ou php -i | grep Thread (Linux/macOS).

\n\n

Différences visuelles dans les noms des distributions

\n\n

Sur le site officiel windows.php.net, vous verrez des noms comme ceux-ci :

\n\n
    \n
  • php-8.3.0-Win32-vs16-x64.zip — généralement c'est la NTS (mais il faut regarder la description)
  • \n
  • php-8.3.0-Win32-vs16-x64-ts.zip — et voici la version TS, avec -ts clairement indiqué
  • \n
\n\n

Sous Linux, les versions ne sont généralement pas séparées — un seul binaire est utilisé, compilé avec le support des threads (ZTS — Zend Thread Safety), mais le multithreading n'est réellement activé qu'avec Apache worker.

\n\n

Scénarios pratiques : quand choisir TS et quand choisir NTS ?

\n\n

Scénario 1 : Apache + mod_php (worker MPM)

\n\n

Si vous utilisez Apache avec les MPM worker ou event (modes multithreadés) — vous avez strictement besoin de la version TS de PHP. Sinon — erreurs fatales, crashs du serveur et perte de données. Cela ressemblera à peu près à

Blogs

Book Recommendations