• 随机生成问题
    • 场景例子

    随机生成问题

    由于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. }