ID

Требование (workerman >= 3.2.1)

Описание:

int Worker::$id

Идентификатор текущего процесса worker в пределах от 0 до $worker->count-1.

Этот атрибут очень полезен для разделения процессов worker, например, если у worker-экземпляра есть несколько процессов, и разработчик хочет установить таймер только в одном из процессов, то можно сделать это, идентифицируя идентификатор процесса id, например, установить таймер только в процессе с идентификатором 0 worker экземпляра (см. пример).

Примечание:

После перезапуска процесса значение идентификатора остается неизменным.

Распределение идентификаторов процессов основано на каждом экземпляре worker. Каждый экземпляр worker начинает нумерацию с 0 для своих процессов, поэтому между экземплярами worker могут быть повторяющиеся идентификаторы процессов, но идентификаторы процессов в пределах одного экземпляра worker не повторяются. Например, в следующем примере:

<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

// у worker-экземпляра 1 есть 4 процесса, идентификаторы процессов будут соответственно 0, 1, 2, 3
$worker1 = new Worker('tcp://0.0.0.0:8585');
// установить запуск 4 процессов
$worker1->count = 4;
// после запуска каждого процесса распечатать текущий идентификатор процесса, то есть $worker1->id
$worker1->onWorkerStart = function($worker1)
{
    echo "worker1->id={$worker1->id}\n";
};

// у worker-экземпляра 2 есть 2 процесса, идентификаторы процессов будут соответственно 0, 1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// установить запуск 2 процессов
$worker2->count = 2;
// после запуска каждого процесса распечатать текущий идентификатор процесса, то есть $worker2->id
$worker2->onWorkerStart = function($worker2)
{
    echo "worker2->id={$worker2->id}\n";
};

// Запустить worker
Worker::runAll();

Результат аналогичен

worker1->id=0
worker1->id=1
worker1->id=2
worker1->id=3
worker2->id=0
worker2->id=1

Примечание: Поскольку в операционной системе Windows не поддерживается настройка количества процессов (count), идентификатор всегда будет только 0. В системе Windows также не поддерживается запуск двух worker-слушателей из одного и того же файла, поэтому этот пример не будет работать в системе Windows.

Пример

У worker-экземпляра есть 4 процесса, и устанавливается таймер только в процессе с идентификатором 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)
{
    // Установить таймер только в процессе с идентификатором 0, остальные процессы с идентификаторами 1, 2, 3 не устанавливают таймер
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4 worker-процесса, установка таймера только в процессе 0\n";
        });
    }
};
// Запустить worker
Worker::runAll();