Stone的由来
Stone最初的目的是为了解决Laravel框架的性能问题, 公司是Laravel框架的重度使用者,在绝大多数场合, Laravel都可以很好的应对,但是对于一些并发量高的应用,比如定时抢购的活动, 存在一些问题。问题的根本原因是:Laravel框架本身性能不高, 由于PHP程序执行机制的特殊性,框架的性能会极大的限制程序的并发能力,这一点相信很多选择或者没选择Laravel的人都有体会。去年年底, 在解决一个性能问题的时候, 尝试性的使用Laravel+Swoole的组合搭建一个TCP的业务Server, 在Laravel资源完全初始化的情况下, 使用Swoole常驻内存并对外提供服务, 这样每个请求就不必再去初始化资源, 从而得到极高的性能提升。然后, 需要对前端提供接口, 所以TCP Server前面再放置一个lumen,对外提供HTTP接口服务。为了便于管理, 我给这个方案取了一个名字:Stone,希望它能稳定发展, 成为性能解决方案的一块基石。
到目前为止,Stone作为接口的方式已经在线上稳定运行超过3个月,有一些很重要的接口也在使用。这里面, 需要重点赞一下Swoole,因为是有了swoole的高性能和稳定, 才有后面的这些事情。
早期Stone的一些缺陷
早期Stone的方案缺陷主要体现在两方面:
程序架构变得复杂,加大测试难度,同时并发性能受限于lumen。
- PHP以简单快速得到大家喜爱, lumen的方式, 程序被分离到laravel和lumen中,加大管理难度。
- Swoole常驻内存, 修改调试需要不断重启进程
- lumen虽然性能不算差, 但是和swoole比起来相差还是很远, 并发要求很高的场合, 还是会成为瓶颈
- 当方案出现问题时, 无法快速降级
适用范围较窄
- 只适用一些无状态的接口调用的方式
- 不支持视图显示, 不支持Session
Stone近期的工作
可以参看之前写的一个优化计划, 目前基本达到的预期的效果。 主要工作为:
- 提高了Stone的适用性, 提供Stone-Web和Stone-Server两种运行方案。前者针对页面后者针对API服务。
- 加强了Stone的兼容性,提供Laravel4.x和Laravel5.x的支持, 支持composer安装
- 避免修改Laravel代码,代价是引入了对runkit的依赖, 但是我认为是值得的。 当然, 如果你不方便使用runkit,倾向于修改laravel源码, 也是可以的。
- 简化了架构, 去除了lumen的依赖, 实现了FastCGI协议, 直接和nginx交互,大大提高了性能。
- 大大简化了使用难度和降级难度, 极小的修改后使用Stone进程替代PHP-FPM就能使用, 降级时替换回来即可。你甚至可以同时使用两种方式, 同一份代码, 只有性能要求高的接口才使用Stone。
关于Stone的一些测试数据
- 线上核心接口请求次数累计超过20亿次,运行稳定
- Laravel5下测试,Stone-Web RPS大于3000, Stone-Server RPS大于8500,同等条件下,原始的Laravel RPS只有120.
- 线上运行超过2年的Laravel4 项目, 包括2000多个路由, 大量的过滤器等, Stone-Web RPS大于1000, 同等条件下, Laravel RPS只有80多。
- 一个实际项目的首页, 包含大量的数据库查询, Stone-Web RPS 为360多, 同等条件下, Laravel RPS只有30多。
进一步了解Stone
只需5分钟, 为你的Laravel项目提供10倍以上的性能提升, 不想试试吗? 如果你对此感兴趣, 可以继续了解Stone是怎么优化Laravel性能的。