ilustrar
1. Semáforo: É uma operação atômica fornecida pelo sistema. Uma quantidade de sinal só pode ser operada por um processo ao mesmo tempo.
Um processo recebe um sinal e deve ser liberado pelo processo.
2. Memória compartilhada: É uma área de memória pública aberta pelo sistema na memória e pode ser acessada por qualquer processo.
Ao mesmo tempo, vários processos podem acessar esta área. Para garantir a consistência dos dados, esta área de memória precisa ser bloqueada ou sinalizada.
Exemplo
echo "pid de progresso pai:{$parentPid}n"; $listafilho = array(); //Cria memória compartilhada, cria semáforo e define chave compartilhada $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $sinal = sem_get($sem_id); const SHARE_KEY = 1; //função produtora produtor(){ global $shareMemory; sinal $ global; $pid = posix_getpid(); $repetirNum = 5; for ($i = 1; $i <= $repeatNum; $i++) { //Adquira o semáforo sem_acquire($signal); if (shm_has_var($shareMemory,SHARE_KEY)){ // Se houver um valor, adicione um $count = shm_get_var($shareMemory,SHARE_KEY); $contar++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) contagem: {$count}n"; }outro{ // Sem valor, inicialização shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) contagem: 0n"; } // Libera após uso sem_release($signal); $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"; } // Aguarde até que todos os processos filhos terminem while(!empty($childList)){ $childPid = pcntl_wait($status); if ($filhoPid > 0){ unset($childList[$childPid]); } } // Libera memória compartilhada e semáforo shm_remove($shareMemory); sem_remove($sinal); echo "({$parentPid})fim do progresso principal!n";
O texto acima é uma introdução aos semáforos PHP e à memória compartilhada. Espero que seja útil para todos.