php自带消息队列,可进程间通信


php自带消息队列,可进程间通信

介绍

本次介绍的是基于php信号控制扩展提供的几个方法

如果只是一个简单的小项目,个人认为没必要通过其他非php形式搭建消息队列,比如基于redis,kafaka,rabbitmq之类的,直接使用php扩展自带的来实现即可。

安装

1. 安装扩展 `pear install sysvsem` 和 `pear install sysvmsg`
1. 将扩展配置到配置文件中

使用

  1. 生产者

    
         $file = __DIR__. '/tmp.queue';
         touch($file);
         $id = ftok( $file, 'm');
         $queue = \msg_get_queue($id);
    
         // 发送消息到队列
         $messageType = 1; //必须大于1
         $message = []; // 进入队列的数据
    
         $serialize = true;
         $block = false;
         $error_code = null;
            
         msg_send($queue , $messageType , $message , $serialize, $block, $error_code);
    
    
  2. 消费者

    
         $file = __DIR__. '/tmp.queue';
         touch($file);
         $id = ftok( $file, 'm');
         $queue = \msg_get_queue($id);
         $messageType = 1; //必须大于1
    
         $serialize = true;
    
         msg_receive($queue , $messageType , $msgType , 2048 , $message , $serialize);
        
    

其他

  • 实际中使用会搭配pcntl信号来监听进程信号,如果收到退出信号,就暂停发送和接收新的任务,将当前的事处理完平滑退出退出
  • 可以通过 msg_stat_queue方法来看当前队列还有多少消息未消费,然后根据当前机器情况,[自动]增添多点消费者或者发出警报之类的。

缺点

  1. 消息丢失问题:如果消息被消费者取出来,然后没被执行完就挂了(非程序上的话),那么这条消息就没了
  2. 只能单机