• swoole是怎么提高php系统的性能的


    swoole框架是一个很神奇很厉害的框架,它弥补了PHP的本身的一些不足之处。其实swoole确切的说是一个使用C语言编写的PHP扩展,Swoole中的网络请求处理是基于事件的,并且充分利用了底层的epoll / kqueue实现,使得为数百万个请求提供服务变得非常容易,但也因此这个扩展不能够在windows系统使用。

      

      Swoole4使用全新的协程内核引擎,现在它拥有一个全职的开发团队,因此我们正在进入PHP历史上前所未有的时期,为性能的高速提升提供了独一无二的可能性。

      协程

      Swoole4或更高版本拥有高可用性的内置协程,您可以使用完全同步的代码来实现异步性能,PHP代码没有任何额外的关键字,底层会自动进行协程调度。

      开发者可以将协程理解为超轻量级的线程, 你可以非常容易地在一个进程中创建成千上万个协程。

      swoole提升性能的几个特性。

      1·系统常驻内存

      基于swoole的程序是常驻内存的程序,在启动时就将系统框架等代码读取并编译完成,不需要每次请求时都执行编译的步骤,可以大大的降低脚本的运行时间。

      2·连接池

      php-fpm 模式的php因为每次 请求结束时都会销毁所有的资源,所以无法正常使用连接池。但是基于swoole的程序是常驻内存模式,可以通过连接池的方式来加速程序。使用连接池一方面可以降低程序的响应时间,同时可以有效的保护后端资源。

      3·可以利用协程处理后端的并行io

      我们开发的时候经常会遇到一个请求要查询多块数据,每个数据之间都需要占用比较长的时间,常规的php-fpm模式因为是阻塞模式运行,无法对这类业务进行很好的加速。但是基于swoole的程序,可以将这类请求协程化处理,并行的去请求后端数据源,将原本sum(a+b+c)的时间变成接近max(a, b, c)。能够大大的优化此类业务。

      swoole可以提高php系统性能和并发性能,可以提高php接口性能,让php可以胜任后端接口的服务。

      Swoole比Node.js有哪些优势?

      多核并行

      node.js的event loop是单进程单线程的,只有一个epoll/kqueue事件轮询被执行。所以无法利用到多核的计算优势。

      swoole的event loop是多线程的,是基于epoll/kqueue的Multi-Reactor模型。这点与nginx/golang相同。另外swoole的多线程Reactor之间不存在锁,这点与nginx不同。它启用了专门的accept线程,类似与JAVA的netty。

      所以在多核CPU的机器上,node.js对网络IO事件的处理能力绝对是要差swoole数倍的,在4核的机器上至少要查2-3倍。

      虽然node.js也提供了多线程的扩展,但对于event_loop来说必须是内核提供,扩展不行的。

      另外node.js未来是否会改造成为多线程Reactor,我估计不会,这不是技术上的难题。而是一旦改成多线程Reactor,node.js恐怕就不是node.js了。失去了原来单线程的各种优势后,反而会一无是处。当然可能node.js官方开发组会思考出解决问题的巧妙办法,一切都是后话了。

      不只是event_loop,执行用户层代码是也是单线程的,不能利用多核计算优势。需要用户自己去fork多进程或者创建线程池。使用难度增加了很多。不像swoole,配置一下参数即可,是天然多进程。

      异步网络IO

      node.js和swoole都是基于epoll/kqueue实现的全异步非阻塞IO,所以这方面大同小异,没有差别。维持TCP长连接的能力是一样的。

      node.js在这里有一个优势就是它支持windows的IOCP。swoole仅支持Linux/FreeBSD/MacOS的epoll/kqueue.

      异步文件读写

      node.js和swoole都提供了基于线程池的异步文件读写,DNS查询功能。node.js最早基于libeio实现,后来才自行实现线程池。swoole一开始就基于线程池设计的。

      实际上这里都是通过多线程阻塞来模拟的,并非真正的异步读写文件。比如同时读写数百个文件时,性能远不如普通的多进程PHP程序。

      swoole中还提供了Linux Native AIO的支持,是真正的内核层异步并行文件读写,不过需要通过修改宏开关,重新编译才可以使用。

      最后结论

      node.js和swoole比没有明显优势,仅在Windows支持方面比swoole要好。node.js中有的特性swoole中都有。个人认为Node.js最大的优势在于:

      node.js使用JavaScript语言,与浏览器、HTML之间的融合度非常高,使用同一种语言既写前端又写后端

      支持Windows平台,利用node-webkit,可以开发PC客户端软件

      node.js的定位应该是前端与后端结合非常紧密的应用场景。如websocket推送,JSON-RPC,轻量级HTTP接口。

      而对于真正专业的后端领域,分布式系统,node.js不适合。

  • 相关阅读:
    SSM项目源码基于SSM实现的小说网站含前后台
    【那些年那些题】轮转数组
    docker镜像打包及上传到harbor
    Reactive.Net绑定Subscribe调用wpf控件报错
    TortoiseSVN 状态图标不显示的两种解决办法
    原理Redis-IntSet
    Flow 简单使用
    C语言版——通讯录进阶(文件版本)
    Java之并发工具类的详细解析
    C语言:删除字符串的空格
  • 原文地址:https://blog.csdn.net/jiyc2008/article/details/139888611