id

Exigé (workerman >= 3.2.1)

Description:

int Worker::$id

Identifiant du processus worker actuel, dans la plage de 0 à $worker->count-1.

Cette propriété est très utile pour distinguer les processus worker, par exemple, si un instance de worker a plusieurs processus, le développeur souhaite uniquement définir un minuteur dans l'un de ces processus, il peut le faire en identifiant l'identifiant du processus, par exemple en définissant le minuteur uniquement dans le processus dont l'identifiant de cette instance de worker est 0 (voir l'exemple).

Attention:

La valeur de l'identifiant ne change pas après le redémarrage du processus.

L'attribution de l'identifiant du processus est basée sur chaque instance de worker. Chaque instance de worker commence à numéroter ses processus à partir de 0, de sorte que les identifiants de processus entre les instances de worker peuvent se répéter, mais les identifiants de processus dans une même instance de worker ne se répètent pas. Par exemple, dans l'exemple suivant :

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

// l'instance worker1 a 4 processus, les identifiants des processus seront respectivement 0, 1, 2, 3
$worker1 = new Worker('tcp://0.0.0.0:8585');
// Définir le démarrage de 4 processus
$worker1->count = 4;
// Chaque processus démarre et affiche l'identifiant de processus actuel soit $worker1->id
$worker1->onWorkerStart = function($worker1)
{
    echo "worker1->id={$worker1->id}\n";
};

// l'instance worker2 a deux processus, les identifiants des processus seront respectivement 0, 1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// Définir le démarrage de 2 processus
$worker2->count = 2;
// Chaque processus démarre et affiche l'identifiant de processus actuel soit $worker2->id
$worker2->onWorkerStart = function($worker2)
{
    echo "worker2->id={$worker2->id}\n";
};

// Exécuter les workers
Worker::runAll();

Sortie similaire à

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

Attention : Sous le système Windows, en raison de l'absence de prise en charge de la configuration du nombre de processus, l'identifiant est uniquement 0. Le système Windows ne prend pas en charge l'initialisation de deux Worker écoutant dans le même fichier, donc cet exemple ne fonctionnera pas sous Windows.

Exemple

Une instance de worker a 4 processus, mettant en place un minuteur uniquement dans le processus avec l'identifiant 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)
{
    // Définir le minuteur uniquement dans le processus avec l'identifiant 0, les autres processus 1, 2, 3 ne définissent pas de minuteur
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4 processus worker, minuteur défini uniquement dans le processus 0\n";
        });
    }
};
// Exécuter le worker
Worker::runAll();