加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP消息队列是什么,怎样新建消息队列和定义消息类型

发布时间:2023-05-17 13:49:48 所属栏目:PHP教程 来源:
导读:这篇文章主要介绍“PHP消息队列是什么,怎样创建消息队列和定义消息类型”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP消息队列是什么,怎样创建消
这篇文章主要介绍“PHP消息队列是什么,怎样创建消息队列和定义消息类型”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP消息队列是什么,怎样创建消息队列和定义消息类型”文章能帮助大家解决问题。
 
说明
 
1、消息队列是存放在内存中的一个队列。
 
2、由于消息队列去数据是,只有一个进程能去到,所以不需要额外的锁或信号量。
 
实例
 
echo "parent progress pid:{$parentPid}\n";$childList = array();
 
// 创建消息队列,以及定义消息类型(类似于数据库中的库)
 
$id = ftok(__FILE__,'m');
 
$msgQueue = msg_get_queue($id);
 
const MSG_TYPE = 1;
 
// 生产者
 
function producer(){
 
    global $msgQueue;
 
    $pid = posix_getpid();
 
    $repeatNum = 5;
 
    for ( $i = 1; $i <= $repeatNum; $i++) {
 
        $str = "({$pid})progress create! {$i}";
 
        msg_send($msgQueue,MSG_TYPE,$str);
 
        $rand = rand(1,3);
 
        sleep($rand);
 
    }
 
}
 
// 消费者
 
function consumer(){
 
    global $msgQueue;
 
    $pid = posix_getpid();
 
    $repeatNum = 6;
 
    for ( $i = 1; $i <= $repeatNum; $i++) {
 
        $rel = msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$message);
 
        echo "{$message} | consumer({$pid}) destroy \n";
 
        $rand = rand(1,3);
 
        sleep($rand);
 
    }
 
}
 
function createProgress($callback){
 
    $pid = pcntl_fork();
 
    if ( $pid == -1) {
 
        // 创建失败
 
        exit("fork progress error!\n");
 
    } else if ($pid == 0) {
 
        // 子进程执行程序
 
        $pid = posix_getpid();
 
        $callback();
 
        exit("({$pid})child progress end!\n");
 
    }else{
 
        // 父进程执行程序
 
        return $pid;
 
    }
 
}
 
// 3个写进程
 
for ($i = 0; $i < 3; $i ++ ) {
 
    $pid = createProgress('producer');
 
    $childList[$pid] = 1;
 
    echo "create producer child progress: {$pid} \n";
 
}
 
// 2个写进程
 
for ($i = 0; $i < 2; $i ++ ) {
 
    $pid = createProgress('consumer');
 
    $childList[$pid] = 1;
 
    echo "create consumer child progress: {$pid} \n";
 
}
 
// 等待所有子进程结束
 
while(!empty($childList)){
 
    $childPid = pcntl_wait($status);
 
    if ($childPid > 0){
 
        unset($childList[$childPid]);
 
    }
 
}
 
echo "({$parentPid})main progress end!\n";
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!