id
Requer (workerman >= 3.2.1)
Descrição:
int Worker::$id
O id do processo worker atual, com um intervalo de 0 até $worker->count-1.
Esse atributo é muito útil para diferenciar processos worker, por exemplo, se um instância de worker tem múltiplos processos, o desenvolvedor pode querer definir um temporizador em apenas um desses processos, e isso pode ser feito identificando o número do processo id, como configurar um temporizador apenas no processo com id 0 dessa instância de worker (veja o exemplo).
Atenção:
O valor do id não muda após a reinicialização do processo.
A alocação do id do processo é baseada em cada instância de worker. Cada instância de worker começa com 0 para numerar seus próprios processos, então os números de processos entre instâncias de worker podem se repetir, mas os números de processos dentro de uma instância de worker não se repetem. Por exemplo, no exemplo abaixo:
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// A instância worker1 tem 4 processos, os ids dos processos serão 0, 1, 2, 3
$worker1 = new Worker('tcp://0.0.0.0:8585');
// Define para iniciar 4 processos
$worker1->count = 4;
// Após cada processo iniciar, imprime o id do processo atual, ou seja, $worker1->id
$worker1->onWorkerStart = function($worker1)
{
echo "worker1->id={$worker1->id}\n";
};
// A instância worker2 tem 2 processos, os ids dos processos serão 0, 1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// Define para iniciar 2 processos
$worker2->count = 2;
// Após cada processo iniciar, imprime o id do processo atual, ou seja, $worker2->id
$worker2->onWorkerStart = function($worker2)
{
echo "worker2->id={$worker2->id}\n";
};
// Executa o worker
Worker::runAll();
A saída será semelhante a
worker1->id=0
worker1->id=1
worker1->id=2
worker1->id=3
worker2->id=0
worker2->id=1
Atenção: sistemas Windows não suportam a configuração do número de processos count, tendo apenas um id que é 0. Em sistemas Windows, não é suportada a inicialização de dois Workers escutando o mesmo arquivo, portanto esse exemplo não funcionará em sistemas Windows.
Exemplo
Uma instância de worker tem 4 processos, e o temporizador é definido apenas no processo com id 0.
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8585');
$worker->count = 4;
$worker->onWorkerStart = function($worker)
{
// Define o temporizador apenas no processo com id 0, os processos 1, 2, 3 não têm temporizador
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 processos worker, temporizador definido apenas no processo 0\n";
});
}
};
// Executa o worker
Worker::runAll();