随机生成问题

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

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

场景例子

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

  1. mt_rand(0, 1); // 此处调用了 mt_rand 已经在父进程内自动播种
  2. $worker_num = 16;
  3. // fork 进程
  4. for ($i = 0; $i < $worker_num; $i++) {
  5. $process = new swoole_process('child_async', false, 2);
  6. $pid = $process->start();
  7. }
  8. function child_async(swoole_process $worker)
  9. {
  10. mt_srand(); // 此处 必须要重新播种 否则会得到相同的结果
  11. echo mt_rand(0, 100) . PHP_EOL;
  12. $worker->exit();
  13. }