使用PHP的ftok()函数实现基于linux下系统级进程间消息通信demon(消息队列模式)

Posted wscsq789

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PHP的ftok()函数实现基于linux下系统级进程间消息通信demon(消息队列模式)相关的知识,希望对你有一定的参考价值。

这里会用到ftok()函数,点击官方文档地址:

ftok

(php 4 >= 4.2.0, PHP 5, PHP 7)

ftok — Convert a pathname and a project identifier to a System V IPC key

说明

ftok ( string $pathname , string $proj ) : int

The function converts the pathname of an existing accessible file and a project identifier into an integer for use with for example shmop_open() and other System V IPC keys.

 以上解释:大意$pathname是文件名(需要确保文件可读), $proj是自己定义的标识,得到的就是一个可访问的路径名和一个整数标识符转换成一个key_t值。

新建msg_send.php

<?php

$key = ftok(__DIR__, ‘p‘);

echo($key . PHP_EOL);

#队列资源句柄
$queue = msg_get_queue($key);
//var_dump($queue);

#队列状态信息
$info = msg_stat_queue($queue);
//var_export($info);

$i = 0;

while($i++ < 10)
{
    msg_send($queue, 1, ‘吃饭了吗? ‘ . $i , false, false);
}

同级目录新建msg_receive.php

<?php
$key = ftok(__DIR__, ‘p‘);

$queue = msg_get_queue($key);

echo("queue_key:" . $key . PHP_EOL);

$i = 0;

//这里是阻塞模式,不会因为while(true)而陷入死循环,内存爆满的情况
while(true) { msg_receive($queue, 0, $msg_type, 1024, $message, false, 0); echo("i: " . $i . ‘, message: ‘ .$message);

sleep(2);//增加耗时方便展示演示效果 }

 

 开始执行

[root@guangzhou msg]# php msg_send.php
1879117732
#为了增加演示效果,开了三个窗口同时运行msg_receive.php,分别传参one, two, three
[root@guangzhou msg]# php msg_receive.php one
queue_key:1879117732
i: 0, index: one, message: 吃饭了吗? 1
i: 0, index: one, message: 吃饭了吗? 2
i: 0, index: one, message: 吃饭了吗? 5
i: 0, index: one, message: 吃饭了吗? 8


[root@guangzhou msg]# php msg_receive.php two
queue_key:1879117732
i: 0, index: two, message: 吃饭了吗? 3
i: 0, index: two, message: 吃饭了吗? 6
i: 0, index: two, message: 吃饭了吗? 9


[root@guangzhou msg]# php msg_receive.php three
queue_key:1879117732
i: 0, index: three, message: 吃饭了吗? 4
i: 0, index: three, message: 吃饭了吗? 7
i: 0, index: three, message: 吃饭了吗? 10

#通过脚本输出可以看到类似redis队列读取的效果
#最后如果不需要可以销毁队列msg_remove_queue($queue)

注意:如果脚本运行期间ftok()函数计算数值发生改变,更改前后读取的队列名可能不一致,比如文件执行前被创建,执行中被删除或重新创建或文件内容本身变动,两次得到的ftok可能会不一样。 

以上是关于使用PHP的ftok()函数实现基于linux下系统级进程间消息通信demon(消息队列模式)的主要内容,如果未能解决你的问题,请参考以下文章

Linux中函数ftok如何产生键值

PHP共享内存段实现,使用shmop函数实现内存共享

ftok函数的使用

Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!

SystemV标准的Linux进程间通信共享内存

Linux进程间通信