为何用swoole来实现 Yar server

  • 提升Yar服务端执行效率
  • 学习swoole, yar(在此感谢laruence,rango及swoole开发团队)

Requirements

  1. php5.4+
  2. ext-swoole 1.8.8+
  3. ext-msgpack 如果yar使用msgpack编码方式

Installation

简单性能测试

测试脚本 example/benchmark.php, 测试环境(虚拟机)

  • cpu: i5 – 4460
  • mem: 4G
  • os: centos6.5
  • php: php7(fpm: 20进程, swoole: 18进程(8 worker + 10 task)

脚本一共完成44次接口调用:

  1. 简单接口调用 2次
  2. 数据库查询接口调用2次
  3. 并发简单接口调用 20次
  4. 并发数据库查询接口调用 20次

在当前测试环境下,fpm环境下的执行时间大概是syar下的4 — 6倍左右, 稍后做更详细的压力测试,服务器、客户端资源占用情况测试

github:https://github.com/stcer/syar

task中能返回的数据通过php的Serialization函数返回到worker进程,因此像Closure等不能被序列化的对象不能返回,包括$exception中可能包括Closure

 

  • 订阅者注册推送地址,关注的事件
  • 服务端将消息存储redis队列
  • 服务端开N个进程,读取redis队列并推送到订阅者url
  • 推送错误进入错误队列
  • 服务定时发送错误队列消息

原型

  • swoole->addProcess(swoole_process)增加的进程不能start()
  • process结束后会被master进程再次创建,所以要么阻塞或进epoll循环
  • 参考 http://wiki.swoole.com/wiki/page/390.html
  • 与worker或task进程通信参考  http://wiki.swoole.com/wiki/page/363.html

 

  1. 在server->start()之前,不要将资源连接用于共用(static或设置到server->var中) worker或task是从主进程中fork,进程间不能共用资源连接
  2. 尽可能在start前加载足够少的文件、对象