Existe uma maneira realista de implementar um modelo multiencadeado no PHP, seja verdadeiro ou apenas simulando-o. Algum tempo atrás, foi sugerido que você pudesse forçar o sistema operacional a carregar outra instância do executável PHP e manipular outros processos simultâneos.
O problema é que, quando o código PHP termina de executar a instância do PHP, permanece na memória porque não há como matá-lo no PHP. Então, se você estiver simulando vários threads, pode imaginar o que vai acontecer. Por isso, ainda estou procurando uma maneira de executar ou simular o multi-threading efetivamente no PHP. Alguma ideia?
php
multithreading
Steve Obbayi
fonte
fonte
Respostas:
Multi-threading é possível em php
Sim, você pode executar multi-threading em PHP com pthreads
Na documentação do PHP :
Teste simples
Primeira corrida
Segunda execução
Exemplo do mundo real
fonte
por que você não usa popen ?
fonte
A segmentação não está disponível no PHP padrão, mas a programação simultânea é possível usando solicitações HTTP como chamadas assíncronas.
Com a configuração de tempo limite da onda definida como 1 e usando o mesmo session_id para os processos que você deseja associar, é possível se comunicar com as variáveis da sessão, como no meu exemplo abaixo. Com esse método, você pode fechar o navegador e o processo simultâneo ainda existe no servidor.
Não se esqueça de verificar o ID da sessão correto como este:
startprocess.php
process1.php
verifysession.php
closeprocess.php
fonte
set_time_limit(0);
caramba! Nunca, nunca faça isso.Enquanto você não pode encadear, você tem algum grau de controle de processo no php. Os dois conjuntos de funções que são úteis aqui são:
Funções de controle de processo http://www.php.net/manual/en/ref.pcntl.php
Funções POSIX http://www.php.net/manual/en/ref.posix.php
Você pode bifurcar seu processo com pcntl_fork - retornando o PID da criança. Então você pode usar posix_kill para definir esse PID.
Dito isto, se você matar um processo pai, um sinal deve ser enviado ao processo filho, dizendo para ele morrer. Se o próprio php não estiver reconhecendo isso, você poderá registrar uma função para gerenciá-lo e fazer uma saída limpa usando pcntl_signal.
fonte
O uso de threads é possível pela extensão Pthread do pthreads
http://www.php.net/manual/en/book.pthreads.php
fonte
Eu sei que essa é uma pergunta antiga, mas para as pessoas que pesquisam, há uma extensão PECL escrita em C que oferece capacidade de multiencadeamento ao PHP agora, está localizada aqui https://github.com/krakjoe/pthreads
fonte
Você pode usar exec () para executar um script de linha de comando (como php de linha de comando) e, se você canalizar a saída para um arquivo, seu script não esperará o término do comando.
Não me lembro bem da sintaxe da CLI do php, mas você gostaria de algo como:
Eu acho que muitos servidores de hospedagem compartilhada têm o exec () desativado por padrão por razões de segurança, mas pode valer a pena tentar.
fonte
Você pode simular a segmentação. O PHP pode executar processos em segundo plano via popen (ou proc_open). Esses processos podem ser comunicados via stdin e stdout. Claro que esses processos podem ser um programa php. Provavelmente é o mais próximo possível.
fonte
Dependendo do que você está tentando fazer, você também pode usar curl_multi para alcançá-lo.
fonte
Eu sei que isso é muito antigo, mas você pode olhar http://phpthreadlib.sourceforge.net/
Ele suporta comunicação bidirecional entre threads e também possui proteções internas para eliminar threads filho (evitando órfãos).
fonte
Você pode ter a opção de:
fonte
A classe Thread está disponível desde PECL pthreads ≥ 2.0.0.
fonte
E o pcntl_fork?
veja nossa página de manual para exemplos: PHP pcntl_fork
fonte
pcntl_fork
não funcionará em um ambiente de servidor da web se o modo de segurança estiver ativado. Nesse caso, ele funcionará apenas na versão CLI do PHP.fonte
Se você estiver usando um servidor Linux, poderá usar
Se você precisar passar alguns argumentos
Em script.php
Ou use o Symfony https://symfony.com/doc/current/components/process.html
fonte
No momento da redação do meu comentário atual, eu não sabia sobre os threads do PHP. Eu mesmo procurei a resposta aqui, mas uma solução alternativa é que o programa PHP que recebe a solicitação do servidor da web delega toda a formulação da resposta a um aplicativo de console que armazena sua saída, a resposta à solicitação, em um arquivo binário e o programa PHP que iniciou o aplicativo de console retorna esse arquivo binário byte a byte como resposta à solicitação recebida. O aplicativo de console pode ser escrito em qualquer linguagem de programação executada no servidor, incluindo aqueles que possuem suporte adequado para segmentação, incluindo programas C ++ que usam o OpenMP.
Um truque não confiável e sujo é usar o PHP para executar um aplicativo de console, "uname",
e imprima a saída desse comando do console na saída HTML para descobrir a versão exata do software para servidor. Em seguida, instale exatamente a mesma versão do software em uma instância do VirtualBox, compile / monte todos os binários totalmente independentes, de preferência estáticos, desejados e faça o upload deles para o servidor. A partir desse momento, o aplicativo PHP pode usar esses binários na função do aplicativo do console que possui multithread apropriado. É uma solução alternativa suja, não confiável, para uma situação, quando o administrador do servidor não instalou todas as implementações necessárias da linguagem de programação no servidor. É importante observar que, a cada solicitação que o aplicativo PHP recebe, os aplicativos de console terminam / exit / get_killed.
Quanto ao que os administradores do serviço de hospedagem pensam sobre esses padrões de uso do servidor, acho que tudo se resume à cultura. No norte da Europa, o provedor de serviços deve fornecer o que foi anunciado e se a execução de comandos do console foi permitida e o upload de arquivos que não são de malware foi permitido, e o provedor de serviços tem o direito de interromper qualquer processo do servidor após alguns minutos ou até 30 segundos , os administradores do serviço de hospedagem não têm argumentos para formar uma reclamação adequada. Nos Estados Unidos e na Europa Ocidental, a situação / cultura é muito diferente e acredito que há uma grande chance de que, nos EUA e / ou na Europa Ocidental, o provedor de serviços de hospedagem se recuse a atender clientes de serviços de hospedagem que usam o truque descrito acima. Esse é apenas o meu palpite, dada a minha experiência pessoal com os EUA serviços de hospedagem e considerando o que ouvi de outras pessoas sobre serviços de hospedagem na Europa Ocidental. No momento da redação do meu comentário atual (2018_09_01), eu não sabia nada sobre as normas culturais dos provedores de serviços de hospedagem na Europa do Sul, administradores de rede na Europa do Sul.
fonte
Pode ser que eu tenha perdido alguma coisa, mas o exec não funcionou como assíncrono para mim no ambiente windows que eu usei seguindo no windows e funcionou como charme;)
fonte
Multithreading significa executar várias tarefas ou processos simultaneamente, podemos conseguir isso no php usando o código a seguir, embora não exista uma maneira direta de obter multithreading no php, mas podemos alcançar quase os mesmos resultados da seguinte maneira.
}
Test_1.php
Isso executará test_1.php duas vezes simultaneamente e os dois processos serão executados em segundo plano simultaneamente, para que você possa obter multithreading em php.
Esse cara fez um ótimo trabalho Multithreading em php
fonte