随机生成问题

由于Swoole本身的原因,在使用随机数时,需要额外注意,如果在父进程内调用了mt_rand,不同的子进程内再调用mt_rand返回的结果会是相同的。所以必须在每个子进程内调用mt_srand重新播种。

shufflearray_rand等依赖随机数的PHP函数同样会受到影响

场景例子

在异步任务,异步进程中,都需要注意随机数播种的问题,如下面的例子

mt_rand(0, 1);    // 此处调用了 mt_rand 已经在父进程内自动播种
$worker_num = 16;

// fork 进程
for ($i = 0; $i < $worker_num; $i++) {
    $process = new swoole_process('child_async', false, 2);
    $pid = $process->start();
}

function child_async(swoole_process $worker)
{
    mt_srand();  // 此处 必须要重新播种 否则会得到相同的结果
    echo mt_rand(0, 100) . PHP_EOL;
    $worker->exit();
}