id

요구사항(workerman >= 3.2.1)

설명:

int Worker::$id

현재 worker 프로세스의 id 번호로, 범위는 0에서 $worker->count-1입니다.

이 속성은 worker 프로세스를 구분하는 데 매우 유용합니다. 예를 들어, 1개의 worker 인스턴스에 여러 프로세스가 있는 경우, 개발자는 그 중 하나의 프로세스에서만 타이머를 설정하고 싶다면, 프로세스 번호 id를 인식하여 이를 수행할 수 있습니다. 예를 들어, 해당 worker 인스턴스 id 번호가 0인 프로세스에만 타이머를 설정할 수 있습니다(예시 참조).

주의:

프로세스가 재시작된 후 id 번호 값은 변하지 않습니다.

프로세스 번호 id의 할당은 각 worker 인스턴스를 기반으로 이루어집니다. 각 worker 인스턴스는 0부터 자신의 프로세스 번호를 매기기 시작하기 때문에, worker 인스턴스 간에 프로세스 번호가 중복될 수 있지만, 하나의 worker 인스턴스 내에서 프로세스 번호는 중복되지 않습니다. 예를 들어 아래와 같은 예가 있습니다:

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

// worker 인스턴스1은 4개의 프로세스를 가지며, 프로세스 id 번호는 각각 0, 1, 2, 3입니다.
$worker1 = new Worker('tcp://0.0.0.0:8585');
// 4개의 프로세스를 시작하도록 설정
$worker1->count = 4;
// 각 프로세스가 시작될 때 현재 프로세스 id 번호 즉 $worker1->id를 출력
$worker1->onWorkerStart = function($worker1)
{
    echo "worker1->id={$worker1->id}\n";
};

// worker 인스턴스2는 2개의 프로세스를 가지며, 프로세스 id 번호는 각각 0, 1입니다.
$worker2 = new Worker('tcp://0.0.0.0:8686');
// 2개의 프로세스를 시작하도록 설정
$worker2->count = 2;
// 각 프로세스가 시작될 때 현재 프로세스 id 번호 즉 $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 설정을 지원하지 않기 때문에 id는 0만 존재합니다. Windows 시스템에서는 동일한 파일로 두 개의 Worker를 초기화하여 수신하는 것이 지원되지 않으므로, Windows 시스템에서는 이 예제를 실행할 수 없습니다.

예제

하나의 worker 인스턴스에 4개의 프로세스가 있으며, 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)
{
    // id 번호가 0인 프로세스에서만 타이머를 설정하고, 나머지 1, 2, 3번 프로세스에서는 타이머를 설정하지 않음
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4개의 worker 프로세스 중 0번 프로세스에서만 타이머를 설정했습니다\n";
        });
    }
};
// worker 실행
Worker::runAll();