无法在同一台服务器上运行3个以上的齿轮工人

时间:2017-02-07 06:11:44

标签: php web-worker gearman

当我运行gearman时,单个服务器上的三名工作人员工作正常但是当我启动第4个时,php代码工作正常,但无法检测新工作人员,也无法清除作业队列。

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();
    }

1 个答案:

答案 0 :(得分:0)

使用GearmanManager你可以运行任何no。工人直到它减慢你的计算机速度并使用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

工人CLass

<?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);