首先列举相关函数
1、msg_get_queue(int $key , $perm=0666) : 生成消息队列句柄
* key :唯一的文件标识;通常ftok() 生成;
* $perm : 读写权限;默认0666
2、msg_queue_exists( int $key) :bool 检查唯一标识符队列是否存在
* key : 唯一标识符
3、msg_receive(resource $queue , int $desiredmsgtype , int $msgtype , int $maxsize , string $message , bool $unserialize=true , int $flags=0 , int $errorcode) : 获取消息队列的一条数据
* queue : 消息队列资源句柄;
* desiredmsgtype : 自定义数据类型(下面会举例说明);
* msgtype : 获取到的自定义消息类型;
* message : 消息内容实体;
* unserialize :是否对消息进行反序列化操作;
* flags : MSG_IPC_NOWAIT :使用该参数如果desiredmsgtype标识没有任何消息,那就会立即返回并且报错,相当于将该函数改为非阻塞模式。
MSG_EXCEPT:当desiredmsgtype大于0 函数返回第一个不等于改值类型的首个消息。 MSG_NOERROR:如果消息比较大,使用该参数函数会自动缩减大小至容量的最大值。 函数默认值为 0
* errorcode :发生错误时 错误码
4、msg_remove_queue(resource $queue):bool 移除一个消息队列
* queue : 消息队列句柄
5、msg_send(resource $queue , int $msgtype , mixed $message , bool $serialize =true, bool $blocking=true , int $errorno):bool 向消息队列中写入一个消息
* queue : 资源句柄
* msgtype : 自定义消息类型
* message : 消息内容
* serialize : 是否序列化消息内容
* blocking : 在队列充满时 是否阻塞写入
* errno :写入错误时错误码
【举例说明】
<?php
$queue=msg_get_queue(ftok(__FILE__,'a'));
$pid=pcntl_fork();
if($pid==0)
{
while(true)
{
//这里的参数二对应msg_send 的参数2 可以实现根据不同的消息类型分类处理不同的队列
msg_receive($queue,1,$msgtype,1024,$message);
echo $message.PHP_EOL;
}
exit;
}
sleep(5);
while(true)
{
//这里的参数二 用于消息队列的标识。意味着我们可以标识不同的队列。实现多队列插入,多队列处理
msg_send($queue,1,fgets(STDIN));
}