首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP队列系统

问PHP队列系统
EN

Stack Overflow用户
提问于 2019-12-13 18:37:16
回答 1查看 446关注 0票数 0

我需要构建一个队列系统,并偶然发现了这个主题How to Build a PHP Queue System。

当队列监听程序运行时,这就像是一种魔力。但偶尔,队列侦听器可能会崩溃或停止,我需要重新启动它。这不是问题。

存在的问题是,在此期间,作业被添加到队列中。但是,当监听程序再次启动时,这些作业不会立即执行。队列为空。如果队列侦听器没有运行,当队列侦听器启动时,作业仍在排队和处理,我该如何处理呢?

队列监听器:

代码语言:javascript
复制
<?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);
    }
}

用于向队列中添加内容的代码

代码语言:javascript
复制
$pipefile = '/storage/queueserver';
$fhp = fopen($pipefile, 'r+') or die ("can't open file $pipefile");
fwrite($fhp, "GenerateLabel|". date('H:i:s')."\n");
EN

回答 1

Stack Overflow用户

发布于 2019-12-13 18:59:27

现在,我假设每次启动脚本时,都会使用posix_mkfifo函数再次创建该文件。

您是否可以通过在脚本中添加以下内容来确认这一点:

代码语言:javascript
复制
umask(0);
if(!file_exists($pipefile)){
    if(!posix_mkfifo($pipefile,0666)) {
        die('unable to create named pipe');
    } else {
        echo "Pipe created";
    }
}

然后第一次启动它。它会回响的。然后退出它,并重新启动。如果它仍然回显,这意味着问题来自于PHP看不到文件已经存在的事实(可能是因为文件的权限?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59320785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档