使用PHP生成多个进程来处理数据.

我有一个需要处理的数据队列(Amazon SQS),我想用多个进程(用
PHP)来完成.

我希望童工做这样的事情(pseduoish代码):



while(true) {

    $array = $queue->fetchNItems(10); // get 10 items

    if(!count($array)) 
        killProcess();

    foreach($array as $item) {
         ... // process the item
         $queue->remove($item);
    }

    sleep(2);
}


 

我总是需要一个子进程来运行,但是在需要的时候我想(fork?)一个子进程,以便它可以帮助更快地处理队列.

有人可以帮我解决我需要的粗略的PHP骨架,还是指向正确的方向?

我想我需要看看http://php.net/manual/en/function.pcntl-fork.php,但我不知道如何使用它来管理多个进程.

最佳答案 当你分叉一个进程.你复制了那个过程.换句话说,副本(fork)包含原始进程具有的所有内容(包括文件句柄)

那你怎么知道你是父母还是分叉的过程?

链接页面中的示例非常清楚地显示了这一点

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
}

?>

将此扩展到您想要的

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
     while(true) {

         $array = $queue->fetchNItems(10); // get 10 items

         if(!count($array)) {
            exit();
         }

         foreach($array as $item) {
              ... // process the item
              $queue->remove($item);
         }

         sleep(2);
     }
}

?>

这将在分叉进程上创建(在此实例中浪费)使用循环来创建多个进程.当孩子完成退出后会杀死孩子的过程.并且pcntl_wait()将返回允许父级继续.我不确定php,但如果父进程死亡或退出,它将终止子进程,即使子进程没有完成.因此pcntl_wait.如果你产生多个孩子,则需要更复杂的系统.

也许而不是分叉你应该看一下exec函数的范围?

一个警告.

分叉过程可能会出现问题,数据库句柄会在子项退出时关闭等.如果出现问题,您还可以使用多个进程终止服务器.花很多时间玩,测试和阅读.

DC

点赞