不能在同一台服务器上运行超过3个gearman工作人员

问题描述:

当我在一台服务器上运行最多三名工人时,工作正常,但是当我启动第四个php代码时工作正常,但无法检测到新工人,不清除工作队列。不能在同一台服务器上运行超过3个gearman工作人员

protected function createWorker() 
{ 
    $this->worker = new \GearmanWorker(); 
    $config = $this->app->config->job_remote; 
    $this->worker->addServer($config['host'], $config['port']); 
    return $this->worker; 
} 
public function listen($eventType, $callback) 
{ 
    if (!($this->worker instanceof \GearmanWorker)){ 
     $this->worker = $this->createWorker(); 
    } 
    $this->worker->addFunction($eventType, $callback); 
    return $this->worker; 
} 

public function doWork($worker) 
{ 
    if (!($worker instanceof \GearmanWorker)){ 
     $worker = $this->createWorker(); 
    } 
    $this->worker = $worker; 
    while (1) { 
     $this->worker->work(); 
     $this->app->log->debug($this->worker->returnCode()); 
     if ($this->worker->returnCode() != \GEARMAN_SUCCESS) { 
      break; 
     } 
    } 
} 

首先,我呼吁 '听' 的方法,然后 '的doWork' 的方法

客户端代码:

protected function createClient() 
    { 
     $this->client = new \GearmanClient(); 
     $config = $this->app->config->job_remote; 
     $this->client->addServer($config['host'], $config['port']); 
     return $this->client; 
    } 

    public function addTask($eventType, array $params) 
    { 
    if (!($this->client instanceof \GearmanClient)){ 
     $this->client = $this->createClient(); 
    } 
    // add single task in queue 
    $this->client->addTaskBackground($eventType, serialize($params)); 
    // Run task 
    $this->client->runTasks(); 
    } 
+0

您的代码在哪里..您尝试过什么 –

+0

我已经添加了代码现在检查 –

+0

您的客户代码在哪里?从你分配工作的地方开始。 –

使用GearmanManager可以高达任何没有运行。的工人,直到它减慢你的电脑,并使用100%的CPU和100%的内存。

Gearman.ini

[GearmanManager] 
worker_dir=./workers 
count=50 
dedicated_count=1 
max_worker_lifetime=3600 
auto_update=1 
log_file=./logs/WebAnalyzerWorker.log 
max_runs_per_worker=3 
timeout=600 

运行的Gearman工人

./vendor/brianlmoon/gearmanmanager/pecl-manager.php -c ./gearman.ini -vvvvv 

工人阶级

<?php 

include dirname(__DIR__)."/vendor/autoload.php"; 

use Services\Log; 
use Services\ServiceInitialization; 
use Lib\Technology\FindWhoisRecords; 
use Illuminate\Database\Capsule\Manager as Capsule; 

class DomainDetailFetchJob{ 

    public function beforeRun() 
    { 
     ServiceInitialization::loadConfig(); 
     ServiceInitialization::loadDatabaseConfiguration(); 
    } 

    public function run($job, &$log) 
    { 
     $log[] = "Starting whois job"; 
     $collection = "whois"; 
     $this->beforeRun(); 
     ServiceInitialization::$config->all();   
     $workload = $job->workload(); 
     //workload 
     $whois = new FindWhoisRecords($workload); 
     if($whois->whois_result["err_code"]==0) { 
      $log[] = "Whois Info fetch successful"; 
      //success save the details 
      $whois->whois_result["result"]["workload"] = $workload; 
      Capsule::table($collection)->where("workload", $workload)->update($whois->whois_result["result"], ['upsert' => true]); 

     } 
     else { 
      $log[] = "Whois Info fetch failed"; 
      $logger = new Log(); 
      $logger->write($whois->whois_result["err_msg"], "error", "Whois Record Job"); 
      unset($logger); 
     } 
    } 

} 

Gearman的客户

$client = new GearmanClient(); 
$client->addServer(); 
$client->doBackground("DomainDetailFetchJob", $url);