иллюстрировать
1. Семафор: это атомарная операция, предоставляемая системой. Количество сигналов может обрабатываться только одним процессом одновременно.
Процесс получает сигнал и должен быть освобожден им.
2. Общая память. Это область общедоступной памяти, открытая системой в памяти, к которой может получить доступ любой процесс.
В то же время несколько процессов могут получить доступ к этой области. Чтобы обеспечить согласованность данных, эта область памяти должна быть заблокирована или сигнализирована.
Пример
echo "Родительский идентификатор прогресса: {$parentPid}n"; $childList = массив(); //Создаем общую память, создаем семафор и определяем общий ключ $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'); $shareMemory = shm_attach($shm_id); $сигнал = sem_get($sem_id); константный SHARE_KEY = 1; // функция производителя Producer(){ глобальный $shareMemory; глобальный $сигнал; $pid = posix_getpid(); $repeatNum = 5; for ($i = 1; $i <= $repeatNum; $i++) { //Получаем семафор sem_acquire($signal); если (shm_has_var($shareMemory,SHARE_KEY)){ // Если значение есть, добавьте его $count = shm_get_var($shareMemory,SHARE_KEY); $счет++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) count: {$count}n"; }еще{ // Нет значения, инициализация shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) count: 0n"; } // Освобождение после использования sem_release($signal); $ранд = рандом(1,3); сон($ранд); } } функция createProgress($callback){ $pid = pcntl_fork(); если ($pid == -1) { //Ошибка создания exit("Ошибка выполнения форка!n"); } иначе если ($pid == 0) { // Программа выполнения подпроцесса $pid = posix_getpid(); $ обратный вызов(); exit("({$pid})дочерний прогресс завершен!n"); }еще{ //Родительский процесс выполняет программу return $pid; } } // 3 процесса записи для ($i = 0; $i < 3; $i++) { $pid = createProgress('продюсер'); $childList[$pid] = 1; echo "создать дочерний прогресс производителя: {$pid} n"; } // Ждем завершения всех дочерних процессов while(!empty($childList)){ $childPid = pcntl_wait($status); если ($childPid > 0){ unset($childList[$childPid]); } } // Освобождаем разделяемую память и семафор shm_remove($shareMemory); sem_remove ($ сигнал); echo "({$parentPid})конец основного прогресса!n";
Вышеуказанное представляет собой введение в семафоры PHP и разделяемую память. Надеюсь, это будет полезно всем.