在worker中使用PHP线程的Gearman
我对Gearman和PHP的worker有问题。 我想同时运行相同的函数。但现在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
$ ./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,哦,谢谢你的回复!