Implementando multi-threading em PHP? Quando você vê este título, você deve pensar que sou louco... Mas na verdade, eu realmente faço isso.
Aqui estão alguns dosmeus
métodos, que foram testados.
que o PHP em si não suporta multi-threading, mas nosso servidor WEB suporta multi-threading.
Em outras palavras, ele pode ser acessado por várias pessoas ao mesmo tempo. Essa também é a base para eu implementar multi-threading em PHP. .Suponha
que estamos executando o arquivo a.php agora. Mas também solicito ao servidor WEB que execute outro b.php no programa
,
assim os dois arquivos serão executados ao mesmo tempo.
é enviado, o servidor WEB irá executá-lo, independentemente de o cliente ter saído).
Às
vezes, o que queremos executar não é outro arquivo, mas uma parte do código deste arquivo.
pode usar parâmetros para controlar qual programa a.php é executado.
Aqui está um exemplo:
//a .php.
Código PHP:---------------------------------------------------------- - ----------------------------------
<?php
função runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //O segundo parâmetro aqui é o cabeçalho da solicitação especificado no protocolo HTTP
//Se você não entendeu, veja a definição na RFC
fclose($fp);
}
função a()
{
$fp = fopen('resultado_a.log', 'w');
fputs($fp, 'Definir em ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
função b()
{
$fp = fopen('resultado_b.log', 'w');
fputs($fp, 'Definir em ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['agir'] == 'a')
{
runThread();
um();
}
senão if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
Abra result_a.log e result_b.log e compare os tempos de acesso dos dois arquivos. Você descobrirá que esses dois estão realmente sendo executados em threads diferentes.
Algumas vezes são exatamente iguais.
O exemplo acima é apenas um exemplo simples e você pode melhorá-lo para outras formas.
Agora que o multi-threading está disponível no PHP, surge um problema, ou seja, a sincronização. Sabemos que o próprio PHP não suporta multi-threading. Portanto, não existe um método como
sincronizar em Java. 1.
Tente não acessar o mesmo recurso para evitar conflitos, mas você pode operar o banco de dados ao mesmo tempo,se
necessário .deseja escrever, use outros métodos para sincronização, por exemplo, chame o rebanho para bloquear o arquivo, etc. Ou crie um arquivo temporário
e aguarde o desaparecimento do arquivo em outro thread while(file_exits('xxx')); equivalente a Quando este arquivo temporário existe, significa que o thread está realmente operando
. Se não existir tal arquivo, significa que outros threads o liberaram.
2. Tente não ler dados deste soquete após runThread executar fputs. Para obter multithreading, é necessário usar o modo sem bloqueio, ou seja, ele retorna imediatamente quando uma função
como
fgets é usada, portanto, haverá problemas ao ler e gravar dados. não é multithread. Ele deve aguardar o retorno acima antes de executaro programa a seguir. Portanto, se você precisar trocar dados, poderá finalmente usar arquivos ou dados externos para concluí-los. $fp) para alcançá-lo.
Dito isso, isso tem algum significado prático? Quando é necessário usar esse método?
A resposta é sim, em um aplicativo que lê continuamente os recursos da rede, a velocidade da rede é um gargalo. adote esse método, você pode
ler páginas diferentes com vários tópicos ao mesmo tempo.
Fiz um programa que pode pesquisar informações em sites de shoppings como 8848 e soaso. Existe também um programa que lê informações comerciais e diretórios de empresas do site do Alibaba e também utiliza
essa tecnologia. Porque ambos os programas precisam se conectar continuamente aos seus servidores para ler as informações e salvá-las no banco de dados. A utilização desta tecnologia elimina o gargalo de espera por uma resposta.