
иллюстрировать
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. Надеюсь, оно будет полезно всем.