id

要求(workerman >= 3.2.1)

說明:

int Worker::$id

當前worker進程的id編號,範圍為0$worker->count-1

這個屬性對於區分worker進程非常有用,例如1個worker實例有多個進程,開發者只想在其中一個進程中設置定時器,則可以通過識別進程編號id來做到這一點,比如只在該worker實例id編號為0的進程設置定時器(見範例)。

注意:

進程重啟後id編號值是不變的。

進程編號id的分配是基於每個worker實例的。每個worker實例都從0開始給自己的進程編號,所以worker實例間進程編號會有重複,但是一個worker實例中的進程編號不會重複。例如下面的例子:

<?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');
// 設置啟動4個進程
$worker1->count = 4;
// 每個進程啟動後打印當前進程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');
// 設置啟動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監聽,所以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的進程上設置定時器,其它1、2、3號進程不設置定時器
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4個worker進程,只在0號進程設置定時器\n";
        });
    }
};
// 運行worker
Worker::runAll();