ThinkPHP为什么用PHP+Swoole协程模式部署运行

这篇具有很好参考价值的文章主要介绍了ThinkPHP为什么用PHP+Swoole协程模式部署运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

看很多ThinkPHP框架的程序商城等系统,现在都用PHP+Swoole协程来运行。在说Swoole前我们先了解下传统PHP模式。

PHP-FPM 的对象常驻内存问题

互联网发展早期,大部分项目的业务逻辑并没有那么复杂,技术生态相对比较简单,也没有 Composer 这样的包管理系统,程序代码足够简单。大部分 PHP 项目没有框架,或者使用一些轻量级框架,比如 Yii、CI、Yaf 、ThinkPHP 等,这种场景下 PHP-FPM/Apache+Mod-PHP 性能是足够的。短生命周期反而带来了非常大的优势,1. 热加载,2. 不会产生内存泄漏,这两个特性使得 PHP 超越其他编程语言,成为 Web 领域最受欢迎的服务器端技术。

在做好 Cache ,优化好 SQL 的前提下,使用 PHP-FPM 单机可以提供数百甚至上千 QPS 的并发处理能力。即便是像 Facebook 、Baidu 这种量级企业的核心系统也是游刃有余的。

随着时代的进步发展,互联网系统变得越来越复杂,程序的业务逻辑越来越重,这时简单的框架或者封装,已经不能满足需求,功能更强大、设计感更强、封装层次更深、拥有微服务/服务治理能力的重量级框架越来越受到追捧,比如 Java 的 Spring,PHP 的 Laravel、Symfony ,这些框架提供的功能更丰富,框架设计更加灵活,随之而来的是运行这些框架的程序也需要更多的计算资源。

一个大型的复杂项目可能在启动时:

  • 加载大量程序文件
  • 创建大量对象
  • 引入大量常量数组、字典
  • 系统扫描,通过反射加载注入组件
  • 主动缓存构建本地缓存
  • 服务注册、发现

由于 PHP-FPM 是短生命周期的模式,除了程序文件的编译可以使用 opcache 解决之外,其他的都是在请求开始执行,请求结束后全部释放,这就带来了严重的性能损耗。以 Laravel 框架为例,只是一个 hello world 级别的接口,压测时 QPS 可能 100 都不到。如果程序再复杂点,恐怕只有几十 QPS 的程度。这样的并发能力无法支撑拥有海量用户的大型互联网系统,导致了 PHP 逐渐被 Java、Golang 编程语言替代,走向没落。使得 PHP 只被应用在一些历史遗留项目,或者访问量不高的管理后台程序 。

Swoole 这样的技术正是解决 PHP 短生命周期性能问题的利器,基于 Swoole 提供的对象内存常驻能力,使得 Laravel、Symfony 这样重量级框架的项目,也可以得到良好的性能。

Laravel 官方也意识到了这个问题,适时地推出了 Laravel Octane ,基于 Swoole 实现常驻内存的 Web 服务。国内也诞生了 Swoft、 Hyperf 这样完全基于 Swoole 协程的 PHP 框架。ThinkPHP 框架也提供了 Swoole 协程的支持。还有很多基于 Swoole 实现的优秀框架,这里就不一一列举了。

为什么要使用协程

其实除了 Swoole 之外,PHP 生态还有 Workerman 这样的优秀国产开源项目、纯 PHP 实现的常驻内存服务框架,也可以解决上面 PHP-FPM 性能问题。为什么还要使用 Swoole ?这就要说 Swoole 提供的协程了。

一个 Web 程序的并发能力,除了计算性能之外,还有一个不可忽视的问题,那就是 IO 等待导致的阻塞,程序代码中可能会查询 MySQL,或者使用 curl 请求其他外部接口,甚至直接通过外网请求第三方服务。若响应时间稳定可控,在极短的时间内可以返回,这是没问题的。不会影响整体的并发能力。但是如果一旦出现响应超时、变慢,整个系统可能就会发生雪崩。并发能力直线下降。举个例子,一个接口请求一个外部接口,正常情况下 100ms 可以返回,如果程序启动了 200 个进程,并发能力就是 2000 QPS,如果出现某些突发原因,响应时间下降到 1s ,这时并发能力就降低到了 200 QPS,相当于并发能力下降了 10 倍。这就可能会带来灾难性后果。这样的问题光是我自己,在生产环境遇到的就不是一次两次了。

而基于 Swoole 协程模式的 Web 程序不会有这种问题。单个 IO 等待过长只会影响当前一个请求所在的协程,其他请求可以继续向下执行。所以不会出现并发能力严重下降。协程的开销极小,多一个协程不过是多一点点内存占用,启动几万甚至几十万个协程也不会给系统带来多大的负担。

PHP Fiber 还是 Swoole

PHP 官方在 8.1 也推出了协程的实现,也就是 Fiber 特性,ReactPHP 和 Amphp 基于 Fiber 实现了一些类似于 Swoole 的功能。这样 PHP 开发者又多了一个选择,那为什么还要继续用 Swoole 呢?
这就要说到 Swoole 提供的 Runtime Hook 技术了。Swoole 除了提供协程特性之外,还提供了一个非常强大的功能:Runtime Hook,它会在运行时自动替换 PHP 语言内置的阻塞 IO 函数,使得这些函数变成非阻塞、协程调度的,包括最常用的 sleep、gethostbyname、proc_open、shell_exec、mysqli、pdo_mysql、curl、redis、file_get_contents、stream、sockets、soap 这些扩展/函数全部支持。使得 PHP 代码一行不用改,就能变为协程版本。甚至十几年前的代码拿过来都可以运行在 Swoole 协程模式下,非阻塞地运行。这是革命性的,使得 PHP 生态获得了重生,可以像 Golang 这样拥有完整的协程生态。

Swoole 协程稳定吗

在 Swoole4 尤其是 4.4 版本之后,Swoole 协程变得非常稳定了。一方面是底层进行了大量重构,代码质量得到了较大的提高,也裁剪掉了各种各样与核心无关的组件,另一方面增加了数千个单元测试脚本,测试覆盖率提升到 70% 以上。这两年已经已经有大量生产项目使用了 Swoole4 协程,验证了它的稳定性。可以看到 Swoole 项目在 Github 上的发版节奏明显放缓了,从过去的一周一个版本到现在2-3个月一个版本,开发团队主要精力是在解决一些长尾问题。进入了一个稳步爬升期。文章来源地址https://www.toymoban.com/news/detail-797444.html

到了这里,关于ThinkPHP为什么用PHP+Swoole协程模式部署运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • APP上线为什么要提前部署安全产品呢?

    一般平台刚上线或者日活跃量比较高的时候,很容易成为攻击者的目标,服务器如果遭遇黑客攻击,资源耗尽会导致平台无法访问,业务也无法正常开展,服务器一旦触发黑洞机制,就会被拉进黑洞很长一段时间,什么也操作不了。用户也会随之批量的流失,更有可能被入侵

    2024年02月12日
    浏览(44)
  • DCL 单例模式设计为什么需要 volatile 修饰实例对象

     DCL 问题,是在基于双重检查锁设计下的单例模式中,存在不 完整对象的问题。而这个不完整对象的本质,是因为指令重排序导致的。 当我们使用 instance=new DCLExample()构建一个实例对象的时候,因为 new 这个操作并不是原子的。所以这段代码最终会被编译成 3 条指令: 为对象

    2024年02月08日
    浏览(43)
  • stm32下载代码到单片机上需要调节BOOT为什么模式

    一、BOOT模式选择图解   二、BOOT模式介绍 所谓启动,一般来说就是指下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 A.   Main Flash memory 是STM32内置的Flash,一般我们使用JTAG或者S

    2023年04月15日
    浏览(35)
  • 【密码学】为什么不推荐在对称加密中使用CBC工作模式

    这篇文章是我在公司内部分享中一部分内容的详细版本,如标题所言,我会通过文字、代码示例、带你完整的搞懂为什么我们不建议你使用cbc加密模式,用了会导致什么安全问题,即使一定要用需要注意哪些方面的内容。 注:本文仅从安全角度出发,未考虑性能与兼容性等因

    2024年02月06日
    浏览(51)
  • 为什么消费返利模式层出不穷?这个消费返利玩法值得你借鉴

    大家好,我是林工,不知道大家听说过消费返利没有?消费返利是互联网常见的一个商业模式,是指互联网平台将自己所销售的商品和服务让渡给消费者并获得一定比例的报酬,消费者通过平台享受到的佣金和消费总额(金额)之间的差额作为回报,消费者可以在购买商品后

    2024年02月01日
    浏览(40)
  • 为什么web项目要打包才能部署到服务器上呢?

            在Web开发中,通常将项目部署到服务器的过程中,会将项目打包为一个可执行的文件或者一组静态资源。以下是一些原因: 1.部署环境的差异: 不同的服务器环境可能具有不同的配置和要求。为了确保应用程序在不同的服务器上可以正常运行,需要将项目打包为

    2024年02月16日
    浏览(43)
  • 【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?

    上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。 不过,我们前面反复说过,学习我的专栏,并不只是让你掌握

    2024年02月10日
    浏览(38)
  • 部署Kubernetes(k8s)时,为什么要关闭swap、selinux、firewall 防火墙?

     关于防火墙的原因(nftables后端兼容性问题,产生重复的防火墙规则) The ip tables tooling can act as a compatibility layer, behaving like iptables but actually configuring nftables. This nftables backend is not compatible with the current kubeadm packages: it causes duplicated firewall rules and breaks kube-proxy . 大概意思就是

    2024年02月02日
    浏览(44)
  • swoole协程框架?

    Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。 以下是Swoole的一些主要特点和功能: 异步非阻塞:Swoole基于事件驱动的模式,支持异步非阻塞

    2024年02月11日
    浏览(31)
  • Swoole协程系统HTTP服务

    先启动宝塔  /etc/init.d/bt start 源码参考 https://github.com/zhangyue0503/swoole/tree/main/4.Swoole%E5%8D%8F%E7%A8%8B 对于异步来说,我们需要监听事件,并且监听的进程是并发的,所以会有一个问题,那就是无法保证前后顺序。 在这个例子中,我们通过在 Connect 事件中暂停5秒,来模拟 connect

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包