我有一个需要处理的数据队列(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