id
Erfordert (workerman >= 3.2.1)
Beschreibung:
int Worker::$id
Die id-Nummer des aktuellen Worker-Prozesses, im Bereich von 0 bis $worker->count-1.
Dieses Attribut ist nützlich, um Worker-Prozesse zu unterscheiden. Wenn beispielsweise ein Worker-Instanz mehrere Prozesse hat und der Entwickler nur in einem dieser Prozesse einen Timer setzen möchte, kann er dies durch Erkennung der Prozess-ID erreichen, zum Beispiel durch das Setzen des Timers nur im Prozess mit der ID-Nummer 0 dieser Worker-Instanz (siehe Beispiel).
Hinweis:
Der Wert der id-Nummer bleibt nach einem Prozessneustart unverändert.
Die Zuweisung der Prozess-ID basiert auf jeder Worker-Instanz. Jede Worker-Instanz beginnt mit der Zuweisung der Prozess-IDs bei 0, sodass es zwischen verschiedenen Worker-Instanzen zu Überschneidungen der Prozess-IDs kommt, jedoch innerhalb einer Worker-Instanz keine doppelten Prozess-IDs existieren. Zum Beispiel das folgende Beispiel:
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// Worker-Instanz 1 hat 4 Prozesse, die Prozess-IDs sind 0, 1, 2, 3
$worker1 = new Worker('tcp://0.0.0.0:8585');
// Setze 4 Prozesse in Betrieb
$worker1->count = 4;
// Drucke die aktuelle Prozess-ID, die $worker1->id nach dem Start jedes Prozesses
$worker1->onWorkerStart = function($worker1)
{
echo "worker1->id={$worker1->id}\n";
};
// Worker-Instanz 2 hat zwei Prozesse, die Prozess-IDs sind 0, 1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// Setze 2 Prozesse in Betrieb
$worker2->count = 2;
// Drucke die aktuelle Prozess-ID, die $worker2->id nach dem Start jedes Prozesses
$worker2->onWorkerStart = function($worker2)
{
echo "worker2->id={$worker2->id}\n";
};
// Starte die Worker
Worker::runAll();
Die Ausgabe ähnelt
worker1->id=0
worker1->id=1
worker1->id=2
worker1->id=3
worker2->id=0
worker2->id=1
Hinweis: Unter Windows-Systemen wird die Einstellung der Anzahl der Prozesse nicht unterstützt, daher gibt es nur die ID 0. Unter Windows-Systemen wird nicht unterstützt, dass zwei Worker aus derselben Datei lauschen, daher kann dieses Beispiel unter Windows nicht ausgeführt werden.
Beispiel
Eine Worker-Instanz hat 4 Prozesse, der Timer wird nur im Prozess mit der ID-Nummer 0 gesetzt.
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)
{
// Setze den Timer nur im Prozess mit der ID-Nummer 0, keine Timer in den Prozessen 1, 2, 3
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 Worker-Prozesse, Timer nur im Prozess 0 gesetzt\n";
});
}
};
// Starte den Worker
Worker::runAll();