id
要求(workerman >= 3.2.1)
說明:
int Worker::$id
當(dāng)前worker進程的id編號,范圍為0
到$worker->count-1
。
這個屬性對于區(qū)分worker進程非常有用,例如1個worker實例有多個進程,開發(fā)者只想在其中一個進程中設(shè)置定時器,則可以通過識別進程編號id來做到這一點,比如只在該worker實例id編號為0的進程設(shè)置定時器(見范例)。
注意:
進程重啟后id編號值是不變的。
進程編號id的分配是基于每個worker實例的。每個worker實例都從0開始給自己的進程編號,所以worker實例間進程編號會有重復(fù),但是一個worker實例中的進程編號不會重復(fù)。例如下面的例子:
<?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');
// 設(shè)置啟動4個進程
$worker1->count = 4;
// 每個進程啟動后打印當(dāng)前進程id編號即 $worker1->id
$worker1->onWorkerStart = function($worker1)
{
echo "worker1->id={$worker1->id}\n";
};
// worker實例2有兩個進程,進程id編號將分別為0、1
$worker2 = new Worker('tcp://0.0.0.0:8686');
// 設(shè)置啟動2個進程
$worker2->count = 2;
// 每個進程啟動后打印當(dāng)前進程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系統(tǒng)由于不支持進程數(shù)count的設(shè)置,只有id只有一個0號。windows系統(tǒng)下不支持同一個文件初始化兩個Worker監(jiān)聽,所以windows系統(tǒng)這個示例無法運行。
范例
一個worker實例有4個進程,只在id編號為0的進程上設(shè)置定時器。
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的進程上設(shè)置定時器,其它1、2、3號進程不設(shè)置定時器
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4個worker進程,只在0號進程設(shè)置定時器\n";
});
}
};
// 運行worker
Worker::runAll();