Outras dicas

A partir do manual do PHP para a pthreads extensão :

pthreads é uma API Orientado Objeto que permite que o usuário da terra multi-threading em PHP. Ele inclui todas as ferramentas necessárias para criar aplicações multi-threaded orientados para a Web ou o Console. aplicações PHP pode criar, ler, escrever, executar e sincronizar com threads, Trabalhadores e Empilháveis.

Por incrível que pareça, é inteiramente verdade. Hoje, PHP pode multi-thread para aqueles que desejam experimentá-lo.

A primeira versão do PHP4, 22 de maio de 2000, o PHP foi fornecido com um fio arquitetura segura - uma maneira para que possa executar múltiplas instâncias do mesmo intérprete em segmentos separados em ambientes SAPI de multi-threaded (Servidor API). Ao longo dos últimos 13 anos, o design desta arquitetura foi mantida e avançado: Foi em uso em produção nos mundos maiores sites desde

.

Enfiar em terra usuário nunca foi uma preocupação para a equipe de PHP, e permanece como tal hoje. Você deve compreender que no mundo onde PHP faz isso de negócios, já existe um método definido de escala - hardware add. Ao longo dos muitos anos PHP existiu, hardware tem mais barato e mais barato e por isso este tornou-se cada vez menos uma preocupação para a equipe de PHP. Enquanto ele estava ficando mais barato, ele também tem muito mais poderoso; Hoje, nossos telefones celulares e tablets têm arquiteturas dual e quad core e muita memória RAM para ir com ele, os nossos desktops e servidores costumam ter 8 ou 16 núcleos, 16 e 32 gigabytes de RAM, embora nem sempre pode ser capaz de ter dois dentro do orçamento e ter dois desktops raramente é útil para a maioria de nós.

Além disso, PHP foi escrito para o programador não, é muitas amadores língua nativa. A razão PHP é tão facilmente adotado é porque é uma língua fácil de aprender e escrever. A razão PHP é tão confiável hoje é por causa da grande quantidade de trabalho que vai para a sua concepção, e cada decisão feita pelo grupo PHP. É de confiabilidade e pura grandeza mantê-lo na luz do ponto, depois de todos esses anos; onde é rivais caíram ao tempo ou pressão.

programação multi-threaded não é fácil para a maioria, mesmo com o mais coerente e API confiável, há coisas diferentes para pensar, e muitos equívocos. O grupo PHP não desejo por terras usuário seja uma característica fundamental-threading multi, nunca foi dada uma atenção séria - e com razão. PHP não deve ser complexo, para todos.

Todas as coisas consideradas, ainda há benefícios decorrentes de se permitindo PHP para utilizá-lo de produção pronto e características testadas para permitir que um meio de fazer o máximo proveito do que temos, quando a adição de mais nem sempre é uma opção, e por nunca é realmente necessário uma série de tarefas.

pthreads alcança, para aqueles que desejam explorá-lo, uma API que não permite que um usuário para aplicações PHP multi-thread. É da API é muito mais um trabalho em andamento, e designou um nível beta de estabilidade e integridade.

É do conhecimento comum que algumas das bibliotecas usa PHP não são thread-safe, deve ficar claro para o programador que pthreads não pode mudar isso, e não tenta tentar. No entanto, qualquer biblioteca que é o segmento de seguros é utilizável, como em qualquer outro segmento de configuração segura do intérprete.

pthreads utiliza Posix Threads (mesmo no Windows), o que o programador cria são tópicos reais de execução, mas para esses tópicos para ser útil, eles devem estar cientes de PHP - capaz de executar código de utilizador, variáveis ??de acções e permitir que um útil meios de comunicação (sincronização). Assim, cada segmento é criado com uma instância do intérprete, mas por design, é intérprete está isolada de todas as outras instâncias do intérprete - assim como ambientes de servidor de API multi-threaded. pthreads tentativas para preencher a lacuna numa sã e forma segura. Muitas das preocupações de tele programador de threads em C simplesmente não estão lá para o programador de pthreads, pelo projeto, pthreads é cópia em ler e copiar na escrita (RAM é barato), então há duas instâncias já manipulam os mesmos dados físicos, mas eles podem tanto afeta os dados em outro segmento. O fato de que o PHP pode usar fio deficiências de segurança em seu núcleo de programação é totalmente irrelevante, threads do usuário, e é operações são completamente seguros.

Por que copiar em ler e copiar na escrita:

public function run() {
    ...
    (1) $this->data = $data;
    ...
    (2) $this->other = someOperation($this->data);
    ...
}

(3) echo preg_match($pattern, $replace, $thread->data);

(1) Enquanto a leitura e bloqueio de gravação são realizadas nas pthreads objeto de armazenamento de dados, os dados são copiados da sua localização original na memória para o armazenamento de objetos. não pthreads não ajustar o refcount da variável, Zend é capaz de liberar os dados originais se não há outras referências a ele.

(2) O argumento para referências someOperation o armazenamento de objetos, os dados originais armazenados, que ele próprio uma cópia do resultado de (1), é copiado novamente para o motor em um recipiente zval, enquanto isso ocorre um bloqueio de leitura é realizada no armazenamento de objeto, o bloqueio será liberado e o motor pode executar a função. Quando o zval é criado, ele tem um refcount de 0, permitindo que o motor para liberar a cópia na conclusão da operação, porque há outras referências a ele existe.

(3) O último argumento para referências preg_match o armazenamento de dados, um bloqueio de leitura é obtida, o conjunto de dados em (1) é copiado para um zval, novamente com um refcount de 0. A trava é liberada, a chamada para preg_match opera sobre uma cópia dos dados, que em si é uma cópia dos dados originais.

As coisas a saber:

  • tabela hash do armazenamento de objeto, onde os dados são armazenados, o segmento de seguros, é
    baseado no TsHashTable fornecido com PHP, por Zend.

  • A loja objeto tem uma leitura e escrita de bloqueio, um bloqueio de acesso adicional é fornecido para o TsHashTable tal forma que se exige (e ele faz, var_dump / print_r, acesso direto a propriedades como o motor de PHP quer fazer referência a eles ) pthreads pode manipular o exterior TsHashTable do API definida.

  • As fechaduras só são realizadas enquanto ocorrem as operações de cópia, em que os exemplares foram feitas as fechaduras são libertados, em uma ordem sensível.

Isso significa que:

  • Quando uma gravação ocorre, não só são uma leitura e escrita de bloqueio realizada, mas uma bloqueio de acesso adicional. A tabela em si é bloqueado, não há maneira possível outro contexto pode bloquear, ler, escrever ou afetá-lo.

  • Quando uma leitura ocorre, não é só o bloqueio de leitura realizada, mas o bloqueio de acesso adicional também, novamente a tabela está bloqueada para baixo.

Sem dois contextos pode fisicamente nem acessar simultaneamente os mesmos dados do armazenamento de objeto, mas gravações feitas em qualquer contexto com uma referência afetará os dados lidos em qualquer contexto com uma referência.

arquitetura nada

Esta é compartilhada ea única maneira de existir é co-existir. Aqueles esclarecido um pouco verá que, há um monte de copiar acontecendo aqui, e eles vão querer saber se isso é uma coisa boa. Um monte de cópia continua dentro de um tempo de execução dinâmica, que é a dinâmica de uma linguagem dinâmica. pthreads é implementado no nível do objeto, porque o bom controle pode ser adquirida ao longo de um objeto, mas os métodos - o código executa a programador - tem outro contexto, livres de bloqueio e cópias - o escopo do método local. O escopo do objeto, no caso de um objeto pthreads deve ser tratado como uma maneira de compartilhar dados entre os contextos, que é de propósito. Com isto em mente que você pode adotar técnicas para evitar o bloqueio do armazenamento de objetos a menos que seja necessário, como passar variáveis ??de âmbito local a outros métodos em um objeto de rosca em vez de tê-los copiar a partir do armazenamento do objeto após a execução.

A maioria das bibliotecas e extensões disponíveis para PHP são invólucros finas ao redor 3 partes, PHP funcionalidade do núcleo de um grau é a mesma coisa. pthreads não é um w finarapper torno Posix Threads; é uma API de segmentação com base em Posix Threads. Não há nenhum ponto na implementação Threads em PHP que é os usuários não entendem ou não pode usar. Não há nenhuma razão para que uma pessoa sem conhecimento do que um mutex é ou não deve ser capaz de tirar proveito de tudo o que têm, tanto em termos de habilidade e recursos. Um objeto funciona como um objeto, mas onde quer que dois contextos seria de outra forma colidem, pthreads fornece estabilidade e segurança.

Quem já trabalhou em java vai ver as semelhanças entre um pthreads objeto e rosqueamento em java, essas mesmas pessoas não terá nenhuma dúvida visto um erro chamado ConcurrentModificationException - como parece um erro levantada pelo tempo de execução java se dois threads escrever o mesmos dados físicos simultaneamente. Eu entendo por que ela existe, mas me deixa perplexo que, com recursos tão barato como eles são, juntamente com o fato do tempo de execução é capaz de detectar a simultaneidade no tempo exato e só que a segurança poderia ser alcançado para o usuário, que escolhe lançar um erro, possivelmente fatal em tempo de execução em vez de gerenciar a execução e o acesso aos dados.

Nenhum desses erros estúpidos será emitida por pthreads, a API está escrito para fazer enfiar o mais estável e compatível como é possível, creio eu.

Multi-threading não é como usar um novo banco de dados, muita atenção deve ser dada a cada palavra no manual e os exemplos fornecidos com pthreads.

Por fim, a partir do PHP manual:

pthreads era, e é, um experimento com bons resultados bonitas. Qualquer de suas limitações ou características podem mudar a qualquer momento; que é a natureza da experimentação. É limitações - muitas vezes impostas pela implementação - existe por uma boa razão; o objectivo de pthreads consiste em proporcionar uma solução útil para a multitarefa em PHP em qualquer nível. No ambiente que pthreads executa, algumas restrições e limitações são necessárias a fim de proporcionar um ambiente estável.

Aqui está um exemplo do que Wilco sugerido:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);

Basicamente, este executa o script PHP na linha de comando, mas retorna imediatamente o PID e, em seguida, executado em segundo plano. (A echo $! Garante nada mais é devolvido diferente do PID.) Isso permite que seu script PHP para continuar ou sair se quiser. Quando eu usei isso, eu ter redirecionado o usuário para outra página, onde a cada 5 a 60 segundos de uma chamada AJAX é feita para verificar se o relatório ainda está em execução. (Eu tenho uma tabela para armazenar o GEN_ID eo usuário é relacionado.) O script de verificação corre o seguinte:

exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
     // less than 2 rows in the ps, therefore report is complete
}

Há um curto post sobre esta técnica aqui: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

Em resumo:. Sim, há multithreading em php, mas você deve usar multiprocessamento vez

Informações RACIONAL: threads vs. processos

Há sempre um pouco confusão sobre a distinção de segmentos e processos, então eu vou logo descrever tanto:

  • A fio é uma seqüência de comandos que a CPU irá processar. Os únicos dados que consiste de um contador de programa. Cada núcleo do processador só irá processar um segmento em um tempo, mas pode alternar entre a execução de diferentes queridos através de agendamento.
  • A processo é um conjunto de recursos compartilhados. Isso significa que ele é composto de uma parte da memória, variáveis, instâncias de objetos, identificadores de arquivo, semáforos, conexões de banco de dados e assim por diante. Cada processo também contém um ou mais segmentos. Todos os tópicos do mesmo processo compartilham seus recursos, então você pode usar uma variável em um segmento que você criou na outra. Se esses tópicos são partes de dois processos diferentes, então eles não podem acessar cada outros recursos diretamente. Neste caso, você precisa inter-processo href="https://stackoverflow.com/questions/956245/interprocess-communication-within-php-with-a-continous-process"> através, por exemplo, tubos, arquivos, bases ...

multiprocessamento

Você pode conseguir computação paralela através da criação de novos processos (que também contêm um novo segmento) com php. Se os seus tópicos não precisa de muita comunicação ou sincronização, esta é a sua escolha, uma vez que os processos são isolados e não podem interferir com o trabalho um do outro. Mesmo se um falhar, que não diz respeito aos outros. Se você precisa de muita comunicação, você deve ler sobre a "multithreading" ou - infelizmente -. Considerar o uso de outra linguagem de programação, porque comunicação e sincronização introduz inter-processo um monte de pele

No PHP você tem duas maneiras de criar um novo processo:

deixe que as OS fazer isso por você :. Você pode dizer ao seu sistema de operação para criar um novo processo e executar um novo (ou o mesmo) script php nele

fazê-lo sozinho com um garfo : php também oferece a possibilidade de usar bifurcação através da função pcntl_fork () . Um bom tutorial sobre como fazer isso podem ser encontrados aqui mas eu fortemente recomendamos que não usá-lo, uma vez garfo é um crime contra a humanidade e especialmente contra oop.

Multithreading

Com multithreading todos os seus segmentos partilhar os seus recursos para que você possa se comunicar facilmente entre e sincronizá-los sem muita sobrecarga. Por outro lado você tem que saber o que está fazendo, já que as condições de corrida e bloqueios são fáceis de produzir, mas muito difícil de depuração.

php

Norma não fornece qualquer multithreading mas há uma (experimental) de extensão que realmente faz - pthreads . Sua documentação api mesmo fez em php.net . Com ele você pode fazer algumas coisas como você pode em real de programação línguas : - ) como este:

class MyThread extends Thread {
    public function run(){
        //do something time consuming
    }
}

$t = new MyThread();
if($t->start()){
    while($t->isRunning()){
        echo ".";
        usleep(100);
    }
    $t->join();
}

Para linux há um guia de instalação aqui mesmo, em stackoverflow do.

Para janelas há um agora:

  • Primeiro você precisa da versão thread-safe de php.
  • Você precisa das versões pré-compiladas de ambos os pthreads e sua extensão php. Eles podem ser baixados aqui . Certifique-se de baixar a versão que seja compatível com a sua versão do PHP.
  • Copiar php_pthreads.dll (do zip você acabou de baixar) para a pasta de extensão php ([phpDirectory] / ext).
  • Copiar pthreadVC2.dll em [phpDirectory] (a pasta raiz - não a pasta de extensão).
  • Editar [phpDirectory] /php.ini e inserir a seguinte linha

    extension=php_pthreads.dll
    
  • Test-lo com o script acima, com um pouco de sono ou algo ali mesmo onde o comentário é.

E agora a grande MAS : Embora isso realmente funciona, php não foi feito originalmente para multithreading. Existe uma versão thread-safe de php e, como de v5.4 parece ser quase livre de bugs, mas usando php em um ambiente multi-threaded ainda é desanimado no php manual (mas talvez eles simplesmente não atualizar seu manual sobre isso, ainda). Um problema muito maior pode ser que um monte de comum extensões não são thread-safe . Assim você pode ter tópicos com esta extensão php, mas as funções que você está dependendo ainda não são thread-safe assim que você vai, provavelmente, condições encontro de corrida, impasses e assim por diante no código que você não escrever-se ...

Você pode usar pcntl_fork () para alcançar algo semelhante a threads. Tecnicamente é processos separados, então a comunicação entre os dois não é tão simples com fios, e eu acredito que não vai funcionar se o PHP é chamado pelo apache.

Se alguém se importa, eu tenho revivido php_threading (não o mesmo que threads, mas similar) e eu realmente tê-lo até o ponto onde ele funciona (um pouco) bem!

página Projeto

download (para Windows PHP 5.3 VC9 TS)

Exemplos

README

pcntl_fork() é o que você está procurando, mas o seu processo não bifurcação enfiar. assim você terá o problema da troca de dados. resolvê-los você pode usar phps semáforo funções ( http: //www.php. net / manual / de / ref.sem.php ) filas de mensagens pode ser um pouco mais fácil para o início de segmentos de memória compartilhada.

De qualquer forma, uma estratégia que eu estou usando em um framework web que estou desenvolvendo que cargas de recursos blocos intensivos de uma página web (provavelmente com solicitações externas) paralelos: Estou fazendo uma lista de tarefas para saber quais dados eu estou esperando e então eu bifurcar fora dos postos de trabalho para cada processo. uma vez feito eles armazenam seus dados no cache apc sob uma chave única o pai de acesso processo de lata. uma vez a cada dados estão lá continua. Eu estou usando simples usleep() que esperar porque a comunicação entre processos não é possível em apache (crianças vai perder a conexão com seus pais e zumbis se tornam ...). então isso me leva à última coisa: é importante para a auto matar todas as crianças! existem as classes assim que os processos de garfo, mas manter os dados, eu não examiná-los, mas Zend Framework tem um, e eles costumam fazer código lento, mas confiável. Você pode encontrá-lo aqui: http://zendframework.com/manual/1.9/ en / zendx.console.process.unix.overview.html eu acho que eles usam segmentos SHM! bem por último mas não menos importante, há um erro no website do Zend, pequeno erro no exemplo.

while ($process1->isRunning() && $process2->isRunning()) {
    sleep(1);
}
should of course be:
while ($process1->isRunning() || $process2->isRunning()) {
    sleep(1);
}

Há uma extensão de Threading sendo activley desenvolvido com base em PThreads que parece muito promissor em https://github.com/ krakjoe / pthreads

Apenas uma atualização, o seu parecer que PHP caras estão trabalhando no apoio fio e está disponível agora.

Aqui está o link para ele: http://php.net/manual/en/book.pthreads.php

Eu tenho uma classe de threading PHP que tem funcionado perfeitamente em um ambiente de produção para mais de dois anos.

EDIT: Esta é agora disponível como uma biblioteca compositor e como parte do meu framework MVC, Hazaar MVC

.

Veja: https://git.hazaarlabs.com/hazaar/hazaar-thread

Eu sei que esta é uma maneira velha questão, mas você pode olhar para http://phpthreadlib.sourceforge.net/

A comunicação bidirecional, suporte para Win32, e há extensões necessárias.

Já ouviu falar sobre appserver de techdivision?

Ele é escrito em PHP e funciona como um appserver gestão multithreads para aplicações PHP de alto tráfego. ainda está em beta, mas muito promesing.

Não é a característica bastante obscura, e que em breve será obsoleto, chamado carrapatos . A única coisa que eu já usei para, é permitir que um script para SIGKILL captura (Ctrl + C) e encerrar graciosamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top