美文网首页我爱编程
PHP内核队列使用一例

PHP内核队列使用一例

作者: 切糕糕 | 来源:发表于2018-04-09 19:54 被阅读37次

写了一段代码,展示了PHP如何使用内核队列。

场景是:父进程产生消息,放入队列,子进程从队列读取消息,并处理。

<?php
$msg_key = ftok(__FILE__, 'a');
$msg_queue = msg_get_queue($msg_key, 0644);

/**
 * 父进程往队列发送消息
 * @param $msg_queue
 * @param $child_count
 */
function parent_main($msg_queue, $child_count) {
    // 发送100个消息
    for ($j = 0; $j !== 100; $j++) {
        msg_send($msg_queue, 1, 'hello ' . $j);
    }
    // 等待所有子进程退出
    for ($j = 0; $j !== $child_count; $j++) {
        pcntl_wait($status);
    }
    // 删除队列
    msg_remove_queue($msg_queue);
}

/**
 * 子进程从队列获取消息
 * @param $msg_queue
 */
function child_main($msg_queue) {
    // 刚启动时先睡一会儿,否则会因为读到的是空队列而直接退出
    usleep(100000);
    while (true) {
        $ret = msg_receive($msg_queue, 0, $message_type,
            1024, $message, true, MSG_IPC_NOWAIT);
        // 如果没有消息可读了,就退出
        if (!$ret) {
            break;
        }
        echo 'Child ' . posix_getpid() . ' receive message: ' . $message . PHP_EOL;
    }
}

$child_count = 4;
for ($i = 0; $i !== $child_count; $i++) {
    $pid = pcntl_fork();
    if ($pid === -1) {
        die('Fork error');
    } else if ($pid === 0) {
        child_main($msg_queue);
        exit(0);
    }
}

parent_main($msg_queue, $child_count);

如果在程序退出前忘记删除队列了,可以用 ipcs 命令查看当前系统中的队列:

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x6d01e8f6 0          root       666        0            0           
0x6d01e8f5 32769      root       666        0            0           
0x6d01e8f4 65538      root       666        0            0           
0x310164c6 98307      root       644        50           2           

记住 msqid 这一列,这是队列ID,然后用 ipcrm 命令就可以删除不用的队列:

ipcrm -q 队列ID

相关文章

  • PHP内核队列使用一例

    写了一段代码,展示了PHP如何使用内核队列。 场景是:父进程产生消息,放入队列,子进程从队列读取消息,并处理。 如...

  • Android跨进程通信-消息队列

    消息队列的使用和原理 消息队列的创建及其如何使用 我们可以通过msgget()函数来创建消息队列,它会在内核空间创...

  • php7.1 安装amqp扩展

    php7.1 安装amqp扩展 在php开发中使用rabbitmq消息队列时,需要安装PHP扩展amqp,安装步骤...

  • 用Redis做一个消息队列

    PHP文件使用redis调用方法,操作入队列,守护进程文件中,使用redis方法操作出队列,然后执行业务逻辑 守护...

  • Laravel队列及supervisor

    队列 参考文档 使用 创建失败数据库 queue.php配置 SendSmsJob类 调用 测试php artis...

  • 好网站

    PHP内核探索深入理解PHP内核RabbitMQ从入门到精通

  • LiteOS内核源码分析:消息队列Queue

    摘要:本文通过分析LiteOS队列模块的源码,掌握队列使用上的差异。 本文分享自华为云社区《LiteOS内核源码分...

  • php RabbitMQ重试

    PHP当消费者抛出异常,代表消费失败使用nack(true)或reject(true),可以让消息重回队列(队列头...

  • centos7 laravel配置supervisor 及遇到错

    背景:公司系统部署,PHP laravel队列 使用Supervisor 进程监控管理系统 Supervisor ...

  • 等待队列

    等待队列概念以及使用 一、概述等待队列在内核中有很多用途,尤其在中断处理、进程同步及定时。等待队列实现事件上的条件...

网友评论

    本文标题:PHP内核队列使用一例

    本文链接:https://www.haomeiwen.com/subject/cyqwhftx.html