php自带消息队列,可进程间通信
介绍
本次介绍的是基于php信号控制扩展提供的几个方法
如果只是一个简单的小项目,个人认为没必要通过其他非php形式搭建消息队列,比如基于redis,kafaka,rabbitmq之类的,直接使用php扩展自带的来实现即可。
安装
1. 安装扩展 `pear install sysvsem` 和 `pear install sysvmsg`
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);
-
消费者
$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
方法来看当前队列还有多少消息未消费,然后根据当前机器情况,[自动]增添多点消费者或者发出警报之类的。
缺点
- 消息丢失问题:如果消息被消费者取出来,然后没被执行完就挂了(非程序上的话),那么这条消息就没了
- 只能单机