ไอดี
ต้องการ (workerman >= 3.2.1)
คำอธิบาย:
int Worker::$id
เลขที่บอกถึง id ของ worker ปัจจุบัน อยู่ในช่วงระหว่าง 0
ถึง $worker->count-1
.
สมบัตินี้มีประโยชน์มากสำหรับการแยก worker process ตัวอย่างเช่น หากมีกรณีที่มี worker คนนึงมีหลายๆ process และนักพัฒนาต้องการตั้งค่าตัวจับเวลาไว้ใน process คนเดียวเท่านั้น ก็สามารถทำได้โดยการระบุ id ของ process ได้ เช่น ต้องการตั้งค่าตัวจับเวลาอยู่ใน process ที่มี id เป็น 0 เท่านั้น (ดูตัวอย่าง)
หมายเหตุ:
หลังจากที่โปรเซสถูกเริ่มต้นใหม่ ค่า id จะไม่เปลี่ยนไป
การจัดสรร id ของ process จะเป็นอิงกับแต่ละ worker instance แต่ละ worker instance จะเริ่มต้นการจัดสรร id ของ process ของตัวเองที่ 0 ดังนั้น id ของ process ของ worker instance มีโอกาสที่จะซ้ำกัน แต่ id ของ process ของ worker instance คนละตัวจะไม่ซ้ำกัน ตัวอย่างเช่น:
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// worker instance ที่ 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 instance ที่ 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 2 instance จากไฟล์เดียวกัน ดังนั้นตัวอย่างนี้ไม่สามารถรันได้ในระบบปฏิบัติการ 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 โดยไม่ต้องไปก่อนตัวจับเวลาให้กับ process ที่มี id เป็น 1, 2, 3
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 โปรเซส worker ตั้งตัวจับเวลาไว้เฉพาะในโปรเซสที่มี id เป็น 0\n";
});
}
};
// รัน worker ทั้งหมด
Worker::runAll();