illustrer
1. Sémaphore : Il s'agit d'une opération atomique fournie par le système. Une quantité de signal ne peut être exploitée que par un seul processus à la fois.
Un processus reçoit un signal et doit être libéré par le processus.
2. Mémoire partagée : Il s'agit d'une zone de mémoire publique ouverte par le système dans la mémoire et accessible par n'importe quel processus.
En même temps, plusieurs processus peuvent accéder à cette zone. Afin de garantir la cohérence des données, cette zone mémoire doit être verrouillée ou signalée.
Exemple
echo "pid de progression parent :{$parentPid}n" ; $childList = tableau(); //Créer une mémoire partagée, créer un sémaphore et définir une clé partagée $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $signal = sem_get($sem_id); const SHARE_KEY = 1 ; // fonction producteur producteur(){ mémoire de partage $ globale ; signal $ global ; $pid = posix_getpid(); $repeatNum = 5 ; pour ( $i = 1; $i <= $repeatNum; $i++) { //Acquérir le sémaphore sem_acquire($signal); si (shm_has_var($shareMemory,SHARE_KEY)){ // S'il y a une valeur, ajoutez-en une $count = shm_get_var($shareMemory,SHARE_KEY); $compte++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) count : {$count}n" ; }autre{ // Aucune valeur, initialisation shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) nombre : 0n" ; } // Libération après utilisation sem_release($signal); $rand = rand(1,3); dormir($rand); } } fonction createProgress($callback){ $pid = pcntl_fork(); si ( $pid == -1) { //Échec de la création exit("erreur de progression du fork !n"); } sinon si ($pid == 0) { // Programme d'exécution de sous-processus $pid = posix_getpid(); $rappel(); exit("({$pid})fin de progression de l'enfant!n"); }autre{ //Le processus parent exécute le programme return $pid; } } // 3 processus d'écriture pour ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('producteur'); $childList[$pid] = 1; echo "créer la progression de l'enfant producteur : {$pid} n" ; } // Attendez la fin de tous les processus enfants while(!empty($childList)){ $childPid = pcntl_wait($status); si ($childPid > 0){ unset($childList[$childPid]); } } // Libère la mémoire partagée et le sémaphore shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid})fin de la progression principale !n" ;
Ce qui précède est une introduction aux sémaphores PHP et à la mémoire partagée. J'espère que cela sera utile à tout le monde.