иллюстрировать
1. Очередь сообщений — это очередь, хранящаяся в памяти.
2. Поскольку только один процесс может получить доступ к данным в очереди сообщений, дополнительные блокировки или семафоры не нужны.
Пример
echo "родительский идентификатор прогресса: {$parentPid}n";$childList = array(); //Создаем очередь сообщений и определяем типы сообщений (аналогично библиотекам в базах данных) $id = ftok(__FILE__,'m'); $msgQueue = msg_get_queue($id); константный MSG_TYPE = 1; // функция производителя Producer(){ глобальный $msgQueue; $pid = posix_getpid(); $repeatNum = 5; for ($i = 1; $i <= $repeatNum; $i++) { $str = "({$pid})прогресс создания! {$i}"; msg_send($msgQueue,MSG_TYPE,$str); $ранд = рандом(1,3); сон($ранд); } } //Потребительская функция потребитель(){ глобальный $msgQueue; $pid = posix_getpid(); $repeatNum = 6; for ($i = 1; $i <= $repeatNum; $i++) { $rel = msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$message); echo "{$message} | потребитель({$pid}) уничтожить n"; $ранд = рандом(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"; } // 2 процесса записи for ($i = 0; $i < 2; $i++) { $pid = createProgress('потребитель'); $childList[$pid] = 1; echo "создать дочерний прогресс потребителя: {$pid} n"; } // Ждем завершения всех дочерних процессов while(!empty($childList)){ $childPid = pcntl_wait($status); если ($childPid > 0){ unset($childList[$childPid]); } } echo "({$parentPid})конец основного прогресса!n";
Вышеупомянутое представляет собой введение в очередь сообщений PHP. Надеюсь, оно будет полезно всем.