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