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