如何构建一个PHP队列系统 [英] How to Build a PHP Queue System

查看:150
本文介绍了如何构建一个PHP队列系统的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须构建一个PHP队列系统,并找到此

I had to build a PHP Queue System, and found this brilliant article http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project and I used it to create a PHP queue system, its very easy to set-up and use.

下面是queue.php的代码,该代码是从shell(puTTy等)运行的.

Below is the code for queue.php, run from shell (puTTy or somesuch).

<?PHP 

//. set this constant to false if we ever need to debug
//. the application in a terminal.
define('QUEUESERVER_FORK', true);

//////// fork into a background process ////////
if(QUEUESERVER_FORK){    
    $pid = pcntl_fork(); 
    if($pid === -1) die('error: unable to fork.');    
    else if($pid) exit(0);        
    posix_setsid();    
    sleep(1);        
    ob_start();
}

$queue = array();

//////// setup our named pipe ////////
$pipefile = '/tmp/queueserver-input';

if(file_exists($pipefile))    
    if(!unlink($pipefile))         
        die('unable to remove stale file');

umask(0);


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);    
    }        

    if(QUEUESERVER_FORK) ob_clean();

}

?>

最困难的部分是使pcntl函数在我的服务器上工作.

The hardest part was getting the pcntl functions to work on my server.

我的问题是如何/如果必须重新启动服务器,如何使作业自动启动?"

My question is "How do i get the job to start automatically when/if the server has to restart?"


如评论中所述,编辑了损坏的链接,并指出了后代的优秀Web存档.


As noted in comments, edited broken link and pointed to excellent web archive for posterity.

推荐答案

我的问题是如何/如果必须重新启动服务器,如何使作业自动启动?"

My question is "How do i get the job to start automatically when/if the server has to restart?"

通过将其添加到服务器启动时启动的事物列表中.不幸的是,这样做的说明因操作系统和OS版本而异.您可能想使用稍微跨平台的东西.我在 supervisor 上有很多运气,您可能会在所选操作系统的软件包回购中找到它.

By adding it to the list of things started when the server starts. Unfortunately the instructions for doing so vary wildly by operating system and OS version. You probably want to use something slightly more cross-platform. I've had a great deal of luck with supervisor, which you can probably find in the package repos on your OS of choice.

也就是说,您正在走疯狂的路线.您正在做的事情以前是由很棒的人做的更好的.查看 Gearman 工作队列系统和相关的

That said, you are going down the route of madness. The thing you're doing has been done before, better, by awesome people. Check out the Gearman work queue system and the accompnaying PECL extension. It happens that supervisor is pretty handy for keeping your Gearman workers alive as well.

这篇关于如何构建一个PHP队列系统的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆