在worker中使用PHP线程的Gearman

在worker中使用PHP线程的Gearman,php,multithreading,fork,gearman,Php,Multithreading,Fork,Gearman,我对Gearman和PHP的worker有问题。 我想同时运行相同的函数。但现在Gearman似乎在排队 我正在搜索的输出是: $ ./daemon.php Starting daemon... Received job: H:www-dev1:15 Received job: H:www-dev1:16 Finished Finished 但当前代码的输出为: $ ./daemon.php Starting daemon... Received job: H:www-dev1:1

我对Gearman和PHP的worker有问题。 我想同时运行相同的函数。但现在Gearman似乎在排队

我正在搜索的输出是:

$ ./daemon.php  
Starting daemon...
Received job: H:www-dev1:15 
Received job: H:www-dev1:16 
Finished
Finished
但当前代码的输出为:

$ ./daemon.php  
Starting daemon...
Received job: H:www-dev1:15 
Finished
Received job: H:www-dev1:16 
Finished
是否有可能使用pcntl_fork()为GearmanWorker拨叉

客户端:
$client = new GearmanClient();
$client->addServer();

$args = array('test' => 'test1');
$args = serialize($args);

$client->doBackground('test', $args);
sleep(1);
$client->doBackground('test', $args);

echo "Done";
工人:

$client = new GearmanClient();
$client->addServer();

$args = array('test' => 'test1');
$args = serialize($args);

$client->doBackground('test', $args);
sleep(1);
$client->doBackground('test', $args);

echo "Done";
#!/usr/bin/php
<?php

echo "Starting daemon..." . PHP_EOL;

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('test', 'testFunc');

while ($worker->work()) {
}

function testFunc($job) {

    echo "Received job: " . $job->handle() . PHP_EOL;
    sleep(10);
    echo "Finished" . PHP_EOL;  
}
#/usr/bin/php

一个工人一次可以处理一项工作。如果需要执行多个作业,当然需要创建多个工人。在您的情况下,只需多次执行“Worker”脚本并将它们放在后台。或者(正如你提到的)创建分叉,但第一个肯定更容易;)

您可以尝试worker clone功能来创建更多worker

GearmanWorker::clone(void)

回答得很好,这是正确的,并且涉及到一些文档较少的需要知道的问题。我使用Supervisor(在Ubuntu中)来确保Gearman workers的多个实例始终在运行。@Gabe Spradlin,如果我错了,请纠正我,但这里的对话是关于php的,不是nodejs的主管module@Velaro我指的是在Linux上的Supervisor程序,它允许您管理希望作为守护进程运行的任何程序。你可以定义你想运行多少实例,程序在被认为失败之前应该重新启动多少次,等等。请看@Gabe Spradlin,哦,谢谢你的回复!