id

Requisito (workerman >= 3.2.1)

Descrizione:

int Worker::$id

L'id del processo worker attuale, con un intervallo da 0 a $worker->count-1.

Questa proprietà è molto utile per distinguere i processi worker, ad esempio, se un'istanza di worker ha più processi e lo sviluppatore desidera impostare un timer solo in uno di questi processi, può farlo identificando l'id del processo, ad esempio impostando il timer solo nel processo dell'istanza di worker con id 0 (vedi esempio).

Attenzione:

Il valore dell'id rimane invariato dopo il riavvio del processo.

L'assegnazione degli id ai processi è basata su ciascuna istanza di worker. Ogni istanza di worker inizia a numerare i propri processi da 0, quindi gli id dei processi possono sovrapporsi tra le istanze di worker, ma non ci saranno duplicati all'interno della stessa istanza di worker. Ad esempio, nel caso seguente:

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

// L'istanza worker1 ha 4 processi, con id che saranno rispettivamente 0, 1, 2, 3
$worker1 = new Worker('tcp://0.0.0.0:8585');
// Imposta l'avvio di 4 processi
$worker1->count = 4;
// Dopo l'avvio di ogni processo, stampa l'id corrente del processo cioè $worker1->id
$worker1->onWorkerStart = function($worker1)
{
    echo "worker1->id={$worker1->id}\n";
};

// L'istanza worker2 ha 2 processi, con id che saranno rispettivamente 0, 1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// Imposta l'avvio di 2 processi
$worker2->count = 2;
// Dopo l'avvio di ogni processo, stampa l'id corrente del processo cioè $worker2->id
$worker2->onWorkerStart = function($worker2)
{
    echo "worker2->id={$worker2->id}\n";
};

// Esegui il worker
Worker::runAll();

L'output sarà simile a

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

Attenzione: il sistema Windows non supporta l'impostazione del conteggio dei processi, quindi avrà solo l'id 0. In un sistema Windows non è possibile inizializzare due Worker dallo stesso file in ascolto, quindi questo esempio non può essere eseguito su un sistema Windows.

Esempio

Un'istanza worker ha 4 processi, con un timer impostato solo sul processo con 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)
{
    // Imposta il timer solo sul processo con id 0, non impostare il timer sugli altri processi 1, 2, 3
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4 processi worker, timer impostato solo sul processo 0\n";
        });
    }
};
// Esegui il worker
Worker::runAll();