O que é thread safe ou não thread thread no PHP?


774

Vi binários diferentes para PHP, como não thread ou thread safe?

O que isto significa?

Qual é a diferença entre esses pacotes?


18
Você pode ler sobre thread-safe em en.wikipedia.org/wiki/Thread_safety Quanto PHP: PHP é thread-safe não acredito que o Mentiras: PHP não é thread-safe entanto Diferença entre PHP segmento seguro e não fio binarie segura Não há muitos recursos disponíveis. Pesquise aqui no Stackoverflow ou no Google.
TigerTiger 26/10/09

Respostas:


668

Informações necessárias sobre abordagens de simultaneidade:

Servidores da web diferentes implementam técnicas diferentes para lidar com solicitações HTTP recebidas em paralelo. Uma técnica bastante popular é o uso de threads - ou seja, o servidor da Web criará / dedicará um único thread para cada solicitação recebida. O servidor da web HTTP Apache suporta vários modelos para lidar com solicitações, um dos quais (chamado MPM de trabalho) usa encadeamentos. Mas ele suporta outro modelo de concorrência chamado MPM prefork, que usa processos - ou seja, o servidor da Web criará / dedicará um único processo para cada solicitação.

Também existem outros modelos de simultaneidade completamente diferentes (usando soquetes assíncronos e E / S), bem como modelos que combinam dois ou até três modelos. Com o objetivo de responder a essa pergunta, estamos preocupados apenas com os dois modelos acima e usando o servidor HTTP Apache como exemplo.

Antecedentes necessários sobre como o PHP "se integra" aos servidores web:

O próprio PHP não responde às solicitações HTTP reais - esse é o trabalho do servidor da web. Então, configuramos o servidor da Web para encaminhar solicitações ao PHP para processamento, depois recebemos o resultado e o devolvemos ao usuário. Existem várias maneiras de encadear o servidor da Web com PHP. Para o servidor HTTP Apache, o mais popular é "mod_php". Este módulo é realmente o próprio PHP, mas compilado como um módulo para o servidor da Web e, portanto, é carregado diretamente dentro dele.

Existem outros métodos para encadear o PHP com o Apache e outros servidores web, mas o mod_php é o mais popular e também servirá para responder à sua pergunta.

Talvez você não tenha entendido esses detalhes antes, porque as empresas de hospedagem e as distribuições GNU / Linux vêm com tudo preparado para nós.

Agora, para a sua pergunta!

Como com mod_php, o PHP é carregado diretamente no Apache, se o Apache manipula a simultaneidade usando seu MPM Worker (ou seja, usando Threads), o PHP deve ser capaz de operar dentro desse mesmo ambiente multiencadeado - o que significa que o PHP precisa seja seguro para threads para poder jogar bola corretamente com o Apache!

Neste ponto, você deve estar pensando "OK, então se estou usando um servidor da Web com vários threads e vou incorporar o PHP diretamente a ele, devo usar a versão segura do thread do PHP". E isso seria um pensamento correto. No entanto, por acaso, a segurança de threads do PHP é altamente contestada . É um campo de uso se você realmente sabe realmente o que está fazendo.

Notas finais

Caso você esteja se perguntando, meu conselho pessoal seria não usar PHP em um ambiente multithread se você tiver a opção!

Falando apenas em ambientes baseados em Unix, eu diria que, felizmente, você só precisa pensar nisso se usar o PHP com o servidor web Apache; nesse caso, é recomendável que você use o MPM pré-fork do Apache (que não usa threads e, portanto, a segurança de threads do PHP não importa) e todas as distribuições GNU / Linux que eu conheço tomarão essa decisão quando você estiver instalando o Apache + PHP através do sistema de pacotes, sem nem mesmo solicitar para uma escolha. Se você for usar outros servidores da web, como nginx ou lighttpd , não terá a opção de incorporar o PHP a eles. Você estará olhando para usar o FastCGI ou algo igual que funciona em um modelo diferente, onde o PHP está totalmente forado servidor da web com vários processos PHP usados ​​para atender solicitações através, por exemplo, do FastCGI. Nesses casos, a segurança da thread também não importa. Para ver qual versão seu site está usando, coloque um arquivo contendo <?php phpinfo(); ?>no site e procure a Server APIentrada. Isso poderia dizer algo como CGI/FastCGIou Apache 2.0 Handler.

Se você também olhar para a versão de linha de comando do PHP - a segurança do encadeamento não importa.

Por fim, se a segurança da thread não importa, qual versão você deve usar - a thread-safe ou a non-thread-safe? Francamente, não tenho uma resposta científica! Mas eu acho que a versão que não é segura para threads é mais rápida e / ou menos problemática, caso contrário, eles ofereceriam a versão segura para threads e não se incomodariam em nos dar a escolha!


2
Então o PHP-FPM não está encadeado? Isso resolve o problema, pois o Fast CGI é usado nos servidores nginx.
Xeoncross 28/10

41
Detalhes impressionantes, venho programando em PHP há anos e nunca soube disso.
23413 Patrick

1
@Xeoncross: Geralmente isso está correto e, na prática, é um dos grandes motivos para gerenciar processos PHP fora do Apache. Examino esse aspecto na minha resposta.
JM Becker

O único problema aqui é que o PHP-FPM não está disponível no Windows. Pelo menos como uma compilação nativa.
Denis V #

9
A segurança do encadeamento do PHP ainda é "altamente contestada" (em 2015 e versão 7)?
Altiano Gerung

261

Para mim, sempre escolho a versão segura sem thread, porque sempre uso o nginx ou executo o PHP na linha de comando.

A versão segura sem thread deve ser usada se você instalar o PHP como um binário CGI, interface de linha de comando ou outro ambiente em que apenas um único thread seja usado.

Uma versão segura para encadeamento deve ser usada se você instalar o PHP como um módulo Apache em um MPM de trabalho (modelo de multiprocessamento) ou outro ambiente em que vários encadeamentos PHP sejam executados simultaneamente.


1
greg, sua resposta deveria ter sido: "Uma versão Thread Thread Safe deve ser usada se você deseja instalar o PHP como um módulo Apache em que o trabalhador é o MPM"
wlf 29/12/12

9
então php que vem com o xampp no ​​Windows é NTS ou TS?
Abudayah

1
E se você usar o servidor da Web embutido PHP? Qual variante do PHP usar para obter o desempenho ideal?
Ariod 01/06/2015

1
@ Dario, acho que é apenas o Windows.
Greg

1
@ChristopherShaw cara, a resposta contém apenas opinião. Não há fonte ou motivo POR QUE usar o ZTS em combinação com um módulo Apache. Não é uma resposta válida. Mesmo 217 pessoas podem estar erradas m8.
Daniel W.

30

O pré-fork Apache MPM com modphp é usado porque é fácil de configurar / instalar. Em termos de desempenho, é bastante ineficiente. Minha maneira preferida de fazer a pilha, FastCGI / PHP-FPM. Dessa forma, você pode usar o MPM Worker, muito mais rápido. Todo o PHP permanece sem thread, mas o Apache serve com thread (como deveria).

Então, basicamente, de baixo para cima

Linux

Apache + Trabalhador do MPM + ModFastCGI (NÃO FCGI) | (ou) | Cherokee | (ou) | Nginx

PHP-FPM + APC

O ModFCGI não suporta corretamente o PHP-FPM ou qualquer aplicativo FastCGI externo. Ele suporta apenas scripts FastCGI gerenciados sem processo. PHP-FPM é o gerenciador de processos PHP FastCGI.


21

Conforme a documentação do PHP ,

O que significa segurança de threads ao baixar PHP?

Segurança de Thread significa que o binário pode funcionar em um contexto de servidor da web com vários threads, como o Apache 2 no Windows. O Thread Safety funciona criando uma cópia de armazenamento local em cada thread, para que os dados não colidam com outro thread.

Então, o que eu escolho? Se você optar por executar o PHP como um binário CGI, não precisará de segurança de encadeamento, porque o binário é invocado a cada solicitação. Para servidores da web multithread, como IIS5 e IIS6, você deve usar a versão encadeada do PHP.

As bibliotecas a seguir não são seguras para threads. Eles não são recomendados para uso em um ambiente multithread.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.