php - 多台服务器上的 PHP fifo 队列系统
问题描述
我正在尝试使用FIFO文件构建队列系统。这实际上在我的本地开发机器上工作得很好。但是当我想部署到生产环境时,我遇到了我的 WEB 服务器和 CLI 服务器是两个单独的服务器的问题。因此,当在 CLI 服务器上启动侦听器并从 WEB 服务器添加某些内容时,fifo 文件不起作用。
所以我需要从 WEB SAPI 启动监听器,但是我该怎么做呢?而且,如果它崩溃了,它需要再次重新启动。
我知道如何在服务器上完成这一切,但不知道如何在多个服务器设置上这样做。
编码:
<?php
//queue-listener.php
function process($job) {
sleep(1); //. make it look like we did work.
return;
}
$queue = array();
//////// setup our named pipe ////////
$pipefile = '/storage/queueserver';
umask(0);
if(!file_exists($pipefile)){
if(!posix_mkfifo($pipefile,0666)) {
die('unable to create named pipe');
}
}
$pipe = fopen($pipefile,'r+');
if(!$pipe) die('unable to open the named pipe');
stream_set_blocking($pipe,false);
//////// process the queue ////////
while(1) {
while($input = trim(fgets($pipe))) {
stream_set_blocking($pipe,false);
$queue[] = $input;
}
$job = current($queue);
$jobkey = key($queue);
if($job) {
echo 'processing job ', $job, PHP_EOL;
process($job);
next($queue);
unset($job,$queue[$jobkey]);
} else {
echo 'no jobs to do - waiting...', PHP_EOL;
stream_set_blocking($pipe,true);
}
}
向队列添加内容的代码
$pipefile = '/storage/queueserver';
$fhp = fopen($pipefile, 'r+') or die ("can't open file $pipefile");
fwrite($fhp, "GenerateLabel|". date('H:i:s')."\n");
解决方案
推荐阅读
- jquery - 无法使用引导程序 4 和角度 6 根据条件显示模态
- python - 变量范围(带线程)
- java - 试图从firebase获取密钥,而不是获得一条奇怪的路径
- lua - 如何反编译这个 Lua 字节码?
- vis.js - 消除由 8 个底层树组成的 vis 网络中节点的重叠
- oop - 事件溯源中的值对象
- python - 如何设置curve_fit的初始值以找到最佳优化,而不仅仅是局部优化?
- python - 嵌套for循环python(求和/数学)
- html - 一种使用 svg 生成内部径向阴影悬停图像的方法
- unity3d - Unity 2D - 为什么 Rect.Contains 在此示例中不起作用?