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