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';

// У экземпляра worker1 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";
};

// У экземпляра worker2 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();