Thread Safe vs Non-Thread Safe no PHP: qual escolher e como acertar?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é thread safe ou non-thread safe no PHP? Entenda de uma vez por todas

\n\n

Se 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\n

Este 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\n

De forma resumida: o que é segurança de threads?

\n\n

Imagine 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\n

Já 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\n

Em 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\n

Quando e por que surgiram as versões TS e NTS?

\n\n

Historicamente, 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\n

Mais 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\n

Como saber qual versão do PHP você está usando?

\n\n

A maneira mais fácil é executar no terminal ou em um script PHP:

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

Procure pela linha Thread Safety. Se estiver enabled, você tem a versão TS. Se estiver disabled, é a NTS.

\n\n

Outra forma é verificar a saída do comando php -i | findstr "Thread" (Windows) ou php -i | grep Thread (Linux/macOS).

\n\n

Diferenças visuais nos nomes dos instaladores

\n\n

No 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
\n\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\n

Cenários práticos: quando escolher TS e quando escolher NTS?

\n\n

Cenário 1: Apache + mod_php (worker MPM)

\n\n

Se 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

Blogs

Book Recommendations