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下执行结果:

  • 相关阅读:
    Dev C++ 工程没有调试信息 解决办法
    写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
    oracle10g登录em后,提示“java.lang.Exception: Exception in sending Request :: null”
    网站登录的破解
    sql 日志恢复
    Oracle expdp/impdp 使用示例
    Oracle数据库备份和恢复的基本命令
    检索 COM 类工厂中 CLSID 为 {{10020200-E260-11CF-AE68-00AA004A34D5}} 的组件时失败解决办法
    win7访问部分win2003速度慢
    公交车路线查询系统后台数据库设计--换乘算法改进与优化
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/12447024.html
Copyright © 2011-2022 走看看