Qu'est-ce que thread safe ou non-thread safe en PHP ? Comprenons une fois pour toutes
\n\nSi 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\nCet 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\nL'essentiel en bref : qu'est-ce que la sécurité des threads ?
\n\nImaginez 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\nEn 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\nEn 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\nQuand et pourquoi les versions TS et NTS sont-elles apparues ?
\n\nHistoriquement, 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\nPlus 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\nComment déterminer quelle version de PHP est installée ?
\n\nLa méthode la plus simple est d'exécuter dans la console ou dans un script PHP :
\n\n<?php\nphpinfo();\n?>\n\nRecherchez la ligne Thread Safety. Si elle indique enabled — vous avez la version TS. Si disabled — c'est la NTS.
\n\nLa deuxième méthode consiste à regarder la sortie de la commande php -i | findstr "Thread" (Windows) ou php -i | grep Thread (Linux/macOS).
Différences visuelles dans les noms des distributions
\n\nSur 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
-tsclairement indiqué \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\nScénarios pratiques : quand choisir TS et quand choisir NTS ?
\n\nScénario 1 : Apache + mod_php (worker MPM)
\n\nSi 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 à