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