Introdução
pthreads é uma API orientada a objetos que fornece todas as ferramentas necessárias para multithreading em PHP. Aplicações PHP podem criar, ler, escrever, executar e sincronizar com Threads, Workers e objetos Threaded.
Esta extensão é considerada sem manutenção e inoperante.
Considere usar parallel no lugar.
A extensão pthreads não pode ser usada em um ambiente de servidor web. Threading em PHP é, portanto, restrito apenas a aplicações baseadas em CLI.
pthreads (v3) só pode ser usado com PHP 7.2+: Isso ocorre porque o modo ZTS não é seguro em 7.0 e 7.1.
A classe Threaded forma a base da funcionalidade que permite a operação dos pthreads. Expõe métodos de sincronização e algumas interfaces úteis para o programador.
A classe Thread permite que threads sejam criadas
simplesmente estendendo-as e implementando um método run
. Quaisquer
membros podem ser gravados e lidos por qualquer contexto com uma referência ao
thread. Qualquer contexto também pode executar qualquer método público e protegido.
O corpo do método run será executado em um thread separado quando o
método Thread::start() da implementação for
chamado a partir do contexto que o criou. Somente o contexto que cria um
thread pode iniciar e ingressar nele.
A classe Worker tem um estado persistente e estará
disponível a partir da chamada para Thread::start() (um
método herdado) até que o objeto saia do escopo ou seja explicitamente
desligamento (via Worker::shutdown()). Qualquer contexto com uma
referência ao objeto worker pode empilhar tarefas no Worker (via
Worker::stack()), onde essas tarefas serão executadas
pelo worker em um thread separado. O método run
de um
objeto worker será executado antes de qualquer objeto na pilha do worker,
permitindo a inicialização de recursos que os objetos a serem executados possam
necessitar.
A classe Pool é usada para criar um grupo de workers para distribuir objetos Threaded entre eles. É a maneira mais fácil e eficiente de usar vários threads em aplicações PHP.
A classe Pool não estende a classe Threaded e, portanto, objetos baseados em pool são considerados objetos PHP normais. Como tal, as suas instâncias não devem ser partilhadas entre diferentes contextos.
A classe Volatile é nova no pthreads v3. É usado para denotar propriedades Threaded mutáveis de classes Threaded (uma vez que agora são imutáveis por padrão). Também é usado para armazenar arrays PHP em contextos Threaded.
A sincronização é uma habilidade importante durante o threading. Todos os objetos que o pthreads cria possuem sincronização integrada na forma (que será familiar aos programadores java) de Threaded::wait() e Threaded::notify(). Chamar Threaded::wait() em um objeto fará com que o contexto espere por outro contexto para chamar Threaded::notify() no mesmo objeto. Este mecanismo permite uma sincronização poderosa entre objetos Threaded em PHP.
Quaisquer objetos destinados ao uso nas partes multithread de sua aplicação devem estender Threaded.
Armazenamento de dados: Como regra geral, qualquer tipo de dados que possa ser serializado pode ser usado como membro de um objeto Threaded, ele pode ser lido e escrito a partir de qualquer contexto com uma referência ao objeto Threaded. Nem todo tipo de dados é armazenado em série; os tipos básicos são armazenados em sua forma verdadeira. Tipos complexos, arrays e objetos que não são encadeados são armazenados serialmente; eles podem ser lidos e gravados no Threaded Object a partir de qualquer contexto com uma referência. Com exceção dos Objetos Threaded, qualquer referência usada para definir um membro de um Objeto Threaded é separada da referência no Objeto Threaded; os mesmos dados podem ser lidos diretamente do Objeto Threaded a qualquer momento por qualquer contexto com uma referência ao Objeto Threaded.
Membros Estáticos: Quando um novo contexto é criado (Thread ou Worker), geralmente eles são copiados, mas recursos e objetos com estado interno são anulados (por questões de segurança). Isso permite que eles funcionem como uma espécie de armazenamento local de threads. Por exemplo, ao iniciar o contexto, uma classe cujos membros estáticos incluem informações de conexão para um servidor de banco de dados, e a própria conexão, terá apenas as informações de conexão simples copiadas, não a conexão. Permitir que o novo contexto inicie uma conexão da mesma forma que o contexto que a criou, armazenando a conexão no mesmo local sem afetar o contexto original.
Quando print_r, var_dump e outras funções de depuração de objetos são executadas, elas não incluem proteção recursiva.
Note:
Recursos: As extensões e funcionalidades que definem recursos em PHP são completamente despreparadas para este tipo de ambiente; O pthreads prevê que os recursos sejam compartilhados entre contextos; no entanto, para a maioria dos tipos de recursos, isso deve ser considerado inseguro. Deve-se ter extrema cautela e cuidado ao compartilhar recursos entre contextos.
No ambiente em que o pthreads é executado, algumas restrições e limitações são necessárias para fornecer um ambiente estável.