• Channel
    • 使用示例:

    Channel

    Swoole-1.9.0新增了一个新的内存数据结构Channel,用于实现高性能的进程间通信,底层基于共享内存+Mutex互斥锁实现,可实现用户态的高性能内存队列。

    • Channel可用于多进程环境下,底层在读取写入时会自动加锁,应用层不需要担心数据同步问题
    • 必须在父进程内创建才可以在子进程内使用
    Channel不受PHPmemory_limit控制

    使用示例:

    1. $chan = new Swoole\Channel(1024 * 256);
    2. $n = 100000;
    3. $bytes = 0;
    4. if (pcntl_fork() > 0)
    5. {
    6. echo "Father\n";
    7. for ($i = 0; $i < $n; $i++)
    8. {
    9. $data = str_repeat('A', rand(100, 200));
    10. if ($chan->push($data) === false)
    11. {
    12. echo "channel full\n";
    13. usleep(1000);
    14. $i--;
    15. continue;
    16. }
    17. $bytes += strlen($data);
    18. // echo "#$i\tpush ".strlen($data)." bytes\n";
    19. }
    20. echo "total push bytes: $bytes\n";
    21. var_dump($chan->stats());
    22. }
    23. else
    24. {
    25. echo "Child\n";
    26. for ($i = 0; $i < $n; $i++)
    27. {
    28. $data = $chan->pop();
    29. if ($data === false)
    30. {
    31. echo "channel empty\n";
    32. usleep(1000);
    33. $i--;
    34. continue;
    35. }
    36. $bytes += strlen($data);
    37. // echo "#$i\tpop " . strlen($data) . " bytes\n";
    38. }
    39. echo "total pop bytes: $bytes\n";
    40. var_dump($chan->stats());
    41. }