ilustrar
1. A fila de mensagens é uma fila armazenada na memória.
2. Como apenas um processo pode acessar os dados na fila de mensagens, não são necessários bloqueios ou semáforos adicionais.
Exemplo
echo "pid de progresso pai:{$parentPid}n";$childList = array(); //Cria uma fila de mensagens e define tipos de mensagens (semelhantes a bibliotecas em bancos de dados) $id = ftok(__FILE__,'m'); $msgQueue = msg_get_queue($id); const MSG_TYPE = 1; //função produtora produtor(){ global $msgQueue; $pid = posix_getpid(); $repetirNum = 5; for ($i = 1; $i <= $repeatNum; $i++) { $str = "({$pid})progresso criado! {$i}"; msg_send($msgQueue,MSG_TYPE,$str); $rand = rand(1,3); dormir($rand); } } //Função consumidor consumidor(){ global $msgQueue; $pid = posix_getpid(); $repetirNum = 6; for ($i = 1; $i <= $repeatNum; $i++) { $rel = msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$mensagem); echo "{$mensagem} | consumidor({$pid}) destruir n"; $rand = rand(1,3); dormir($rand); } } function createProgress($callback){ $pid = pcntl_fork(); se ($pid == -1) { //Falha na criação exit("erro de progresso do fork!n"); } senão if ($pid == 0) { // Programa de execução do subprocesso $pid = posix_getpid(); $retorno de chamada(); exit("({$pid})fim do progresso filho!n"); }outro{ //O processo pai executa o programa return $pid; } } // 3 processos de escrita para ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('produtor'); $childList[$pid] = 1; echo "criar progresso filho produtor: {$pid} n"; } // 2 processos de escrita para ($i = 0; $i < 2; $i ++ ) { $pid = createProgress('consumidor'); $childList[$pid] = 1; echo "criar progresso filho do consumidor: {$pid} n"; } // Aguarde até que todos os processos filhos terminem while(!empty($childList)){ $childPid = pcntl_wait($status); if ($filhoPid > 0){ unset($childList[$childPid]); } } echo "({$parentPid})fim do progresso principal!n";
O texto acima é uma introdução à fila de mensagens PHP. Espero que seja útil para todos.