Vi binários diferentes para PHP, como não thread ou thread safe?
O que isto significa?
Qual é a diferença entre esses pacotes?
Vi binários diferentes para PHP, como não thread ou thread safe?
O que isto significa?
Qual é a diferença entre esses pacotes?
Respostas:
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.
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.
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.
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 API
entrada. Isso poderia dizer algo como CGI/FastCGI
ou 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!
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.
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.
Conforme a documentação do 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.