• 技术文章 >PHP >PHP教程

    php消息队列的介绍

    小妮浅浅小妮浅浅2021-06-19 13:52:08原创4539

    说明

    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";

    以上就是php消息队列的介绍,希望对大家有所帮助。更多php学习指路:php教程

    专题推荐:php消息队列
    上一篇:php中PCRE2的使用 下一篇:php信号量和共享内存分别是什么

    相关文章推荐

    • php工厂模式的介绍• php中Redis和Memcached的不同• php双引号和单引号的区别• php中get和post有哪些不同• php中require和include如何区分• php PSR-4是什么意思• php7.3中Heredoc和Nowdoc语法的使用• php尾部逗号的使用• php中PCRE2的使用• php中实现数组去重的函数• php数组中如何重置索引• php中array_filter清除空值• php数组中array_product函数的使用• php数组中array_count_values的使用

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网