首页 > 解决方案 > 多台服务器上的 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");

标签: phpqueue

解决方案


推荐阅读