mysql异步非阻塞方式_如何理解swoole异步非阻塞?

传统的apache2handler或php-fpm本质上都是短生命周期(请求后释放资源)的FastCGI运行模式. 请求来了,master进程会调用worker进程来处理,处理完后释放资源. 假设你在functions.php里定义了1000个函数,那么每次请求,都要重新定义一次,有一定的性能损失. 好处则是修改保存代码后,下一个请求立即生效. 不过,PHP内置了opcache扩展,可以把functions.php对应的二进制中间码opcode缓存在内存,避免每个请求重复解析一次functions.php. 每次请求,只需重新执行一次functions.php对应的opcode指令. 另外,为了避免每次请求都重复建立MySQL/Redis等外部资源的连接,PHP引入了持久连接的机制. 让内存常驻的Apache工作进程或者PHP-FPM工作进程来维持到MySQL/Redis的长连接, 下次代码中出现 new PDO() 或者 new Redis() 时,连接存在则直接返回,连接超时断开则自动重连并返回. 这些操作对PHP开发者来说是透明的,但也有一些注意事项,因为一个MySQL长连接对应一次MySQL会话, MySQL会话中修改的东西(比如事务是否自动提交)会影响到下一次请求.

而Swoole内置的服务器(HTTP/WebSockets/MQTT/TCP/UDP),需要运行在php-cli下,是一个php-cli下的daemon守护进程服务. 也就是说,PHP逻辑是内存常驻的,服务启动后,只需加载和执行一次functions.php. 所以在函数和类以及其他全局资源的定义上,内存常驻的服务有性能优势. 但缺点是修改functions.php代码,必须重启PHP服务才能生效.

除了内存常驻外,异步当然也是Swoole高性能的一个原因,也是Swoole核心竞争力所在. 但需要明确的是,异步是用来解决IO阻塞的场景的有效手段,所以异步最直观的性能优势就是: 无需多线程,一个进程在同一时间就能维持成千上万(C10K)甚至百万(C1000K)个连接,这就是所谓的"并发". 另外,Swoole也内置了很多异步的客户端(HTTP/Redis/MySQL等),用这些客户端能够异步发起多个请求访问外部资源(API),而不会阻塞当前工作进程. 而且,Swoole还内置了异步毫秒定时器,让开发者在PHP里实现定时任务变得轻而易举. 还有,Swoole内置了task进程池,能让开发者把CPU计算密集或其他一些还没有实现异步的操作(比如SMTP发送邮件)放到task进程池里跑, 避免阻塞worker进程,让worker尽量保持异步非阻塞的状态. 总而言之,Swoole就是尽量利用异步思想来减少阻塞对服务吞吐量的影响,从而提升性能.

Swoole高性能的三大因素:

底层用C实现 + PHP逻辑内存常驻 + 异步服务器端和客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值