O que é thread safe ou non-thread safe no PHP? Entenda de uma vez por todas
\n\nSe você já instalou o PHP no Windows ou configurou um servidor web, provavelmente já viu as misteriosas siglas TS e NTS nos nomes dos instaladores. Ou leu avisos na documentação: "Escolha a versão thread-safe ou non-thread-safe". E na hora surgiu a dúvida: "O que isso significa? E o que acontece se eu escolher a errada?"
\n\nEste artigo é o seu guia completo sobre segurança de threads no PHP. Vamos entender as diferenças entre as versões thread safe (TS) e non-thread safe (NTS), quando usar cada uma e como evitar problemas de incompatibilidade de extensões. Vamos nessa!
\n\nDe forma resumida: o que é segurança de threads?
\n\nImagine que o PHP é um chef de cozinha. Cada requisição ao seu site é um novo pedido. No modo non-thread safe, cada pedido é preparado por um chef diferente em sua própria cozinha. Eles não atrapalham uns aos outros, pois cada um tem suas próprias facas, panelas e ingredientes. Sem memória compartilhada, sem conflitos.
\n\nJá no modo thread safe, você tem um único chef, mas ele trabalha com várias mãos (threads). Todas as mãos compartilham a mesma cozinha, os mesmos utensílios e a mesma memória. O desafio é não pegar a mesma faca ao mesmo tempo. Para evitar isso, são necessários bloqueios e sincronização — é isso que chamamos de segurança de threads (thread safety).
\n\nEm termos simples: Thread Safe (TS) significa que o PHP funciona em ambientes com múltiplas threads, onde um único processo lida com várias requisições simultâneas. Non-Thread Safe (NTS) significa que o PHP opera em modo single-thread, onde cada requisição é um processo separado.
\n\nQuando e por que surgiram as versões TS e NTS?
\n\nHistoricamente, o PHP foi desenvolvido como um módulo para Apache (mod_php). O Apache pode funcionar em dois modos: prefork (um processo por requisição) e worker (um processo com múltiplas threads). No prefork, a segurança de threads não é necessária — cada requisição é isolada. Já no worker, ela é essencial.
\n\nMais tarde, com o crescimento do FastCGI (PHP-FPM) e do Nginx, ficou claro que nesses cenários a multitarefa dentro do PHP não é usada. O FastCGI cria processos separados, e cada um funciona de forma independente. Para que carregar um código pesado de bloqueios? Foi assim que surgiram as versões mais leves non-thread safe.
\n\nComo saber qual versão do PHP você está usando?
\n\nA maneira mais fácil é executar no terminal ou em um script PHP:
\n\n<?php\nphpinfo();\n?>\n\nProcure pela linha Thread Safety. Se estiver enabled, você tem a versão TS. Se estiver disabled, é a NTS.
\n\nOutra forma é verificar a saída do comando php -i | findstr "Thread" (Windows) ou php -i | grep Thread (Linux/macOS).
Diferenças visuais nos nomes dos instaladores
\n\nNo site oficial windows.php.net, você encontrará nomes como:
\n\n- \n
- php-8.3.0-Win32-vs16-x64.zip — geralmente é a versão NTS (mas vale confirmar na descrição) \n
- php-8.3.0-Win32-vs16-x64-ts.zip — esta é a versão TS, claramente indicada com
-ts\n
No Linux, as versões geralmente não são separadas — há um único binário compilado com suporte a threads (ZTS — Zend Thread Safety), mas o modo multithread só é ativado ao usar o Apache worker.
\n\nCenários práticos: quando escolher TS e quando escolher NTS?
\n\nCenário 1: Apache + mod_php (worker MPM)
\n\nSe você usa Apache com os modos worker ou event MPM (modos multithread), você precisa obrigatoriamente da versão TS do PHP. Caso contrário, espere erros fatais, quedas do servidor e perda de dados. Algo como