zoukankan      html  css  js  c++  java
  • swoole(7)php进程间通信-消息队列

    php实现消息队列操作

    ftok:可以将一个路径转换成消息队列可用的key值

    msg_get_queue:第一个参数是消息队列的key 第二个参数是消息队列的读写权限

    server代码:

    <?php
    /**
     * Created by PhpStorm.
     * User: huahua
     * Date: 2020/3/6
     * Time: 下午3:51
     */
    
    /**
     * msg_send
    第1个参数 : resource $queue 表示要写入的消息队列资源。
    第2个参数 : int $msgtype 表示写入消息队列的 消息类型,这个参数是 配合 msg_receive读取消息队列函数 使用的,下面会说。
    第3个参数 : mixed $message 你要发送的信息,最大为 65536 个字节。
    第4个参数 : bool $serialize = true 为可选项,是否序列化你发送的消息。
    第5个参数 : bool $blocking = true 是否阻塞,当你发送的消息很大,而此时的消息队列无法存入的时候,此时消息队列就会阻塞,除非等到有别的进程从消息队列中读取了别的消息,然后消息队列有足够的空间存储你要发送的信息,才能继续执行。你可以设置这个参数为false,这样你发送信息就会失败,此时错误信息会在 第6个参数 $errorcode中体现,错误码为 MSG_EAGAIN ,你可以根据这个错误码,重新发送你的消息。
    第6个参数 : int &$errorcode 记录写入中出现的一系列错误。
    
     * msg_receive
    第1个参数:resource $queue 表示要读取的消息队列资源。
    第2个参数 :int $desiredmsgtype 读取的消息类型。这个参数为 0 的时候,你可以读取 msg_send 以任意 消息类型 发送的消息。 如果此参数和你发送的某个消息类型相同,比如你有 2个消息,一个是通过 1类型发送的,一个是通过2 类型发送的。你用 0 可以接收这两种消息 ,而你用 1 只能接收到 以1类型发送的消息。
    第3个参数 : int &$msgtype 你读取到的信息,它发送时的消息类型会存储在该参数中。
    第4个参数 : int $maxsize 你以多大的字节去读取消息,如果这个值小于你要读取的内容的长度,你会读取失败。
    第5个参数 :mixed &$message 读取的内容。
    第6个参数 : bool $unserialize = true 内容是否序列化
    第7个参数 :int $flags = 0 读取标识。除了默认的0 之外,还有3个参数可选 MSG_IPC_NOWAIT 这个参数表示如果没有从消息队列中读取到信息,会立马返回,并返回错误码 MSG_ENOMSG.
    
    MSG_EXCEPT 这个参数 是配合 第2个参数使用的,如果使用这个参数,你读取到的第一个参数,不是你第一个发送的参数。(队列先进先出)
    MSG_NOERROR 如果读取的内容过大,而你指定的第4个参数又不够的时候,它会截断这个消息,并且不报错。
     */
    
    //生成消息队列的key
    $key = ftok(__DIR__,'u');
    //产生一个消息队列
    $queue = msg_get_queue($key);
    
    $pid =  pcntl_fork();
    
    if ($pid == 0){
        //将一条消息加入到消息队列
    //    msg_send($queue,10,"hailo");
        //从消息队列中读取一条消息
        msg_receive($queue,6,$message_type,1024,$message);
        var_dump($message);
        exit();
    }elseif ($pid){
    //    msg_receive($queue,10,$message_type,1024,$message);
    //    var_dump($message);
    
        pcntl_wait($status);
        msg_remove_queue($queue);
    }

    test.php

    <?php
    /**
     * Created by PhpStorm.
     * User: huahua
     * Date: 2020/3/6
     * Time: 下午3:06
     */
    $key=ftok(__DIR__,'u');
    $msg_queue=msg_get_queue($key);
    msg_send($msg_queue,10,"我是外部程序发送的消息");

    cli下执行结果:

  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/12447024.html
Copyright © 2011-2022 走看看