当前位置: 首页 > news >正文

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个月一个版本,开发团队主要精力是在解决一些长尾问题。进入了一个稳步爬升期。

相关文章:

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

看很多ThinkPHP框架的程序商城等系统,现在都用PHPSwoole协程来运行。在说Swoole前我们先了解下传统PHP模式。 PHP-FPM 的对象常驻内存问题 互联网发展早期,大部分项目的业务逻辑并没有那么复杂,技术生态相对比较简单,也没有 Com…...

Vulnhub-tr0ll-1

一、信息收集 端口收集 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable] | ftp-syst: | STAT: | FTP …...

服务器和电脑有啥区别?

服务器可以说是“高配的电脑”,两者都有CPU、硬盘、电源等基础硬件组成,但服务器和电脑也是有一定区别的,让小编带大家了解一下吧! #秋天生活图鉴# 1、稳定性需求不同:服务器是全年无休,需要高稳定性&…...

C语言——编译和链接

(图片由AI生成) 0.前言 C语言是最受欢迎的编程语言之一,以其接近硬件的能力和高效性而闻名。理解C语言的编译和链接过程对于深入了解其运行原理至关重要。本文将详细介绍C语言的翻译环境和运行环境,重点关注编译和链接的各个阶段…...

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通…...

如何画出优秀的系统架构图-架构师系列-学习总结

--- 后之视今,亦犹今之视昔! 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…...

VR转接器:打破界限,畅享虚拟现实

你是否曾梦想过踏入另一个世界,体验那种仿佛置身其中的感觉?随着科技的飞速发展,虚拟现实(VR)已经成为了现实。而VR转接器,正是让你畅享虚拟现实的关键所在。 添加图片注释,不超过 140 字&…...

C++学习笔记——用C++实现树(区别于C)

树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例,并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…...

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案,搭载Android 11.0操作系统, 主频最高2.0GHz,效能有大幅提升;采用12nm先进工艺,具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器,最高主频为680MHz, 支持108…...

JPA查询PostgreSQL行排序问题

文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题 我们项目使用Spring Boot构建,使用JHipster生成业务代码,包含基础的增删改查代码使用PostgreSQL作为业务数据库,使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时&#x…...

【css】渐变效果

css渐变效果 使用 CSS 渐变可以在两种颜色间制造出平滑的渐变效果。 用它代替图片,可以加快页面的载入时间、减小带宽占用。同时,因为渐变是由浏览器直接生成的,它在页面缩放时的效果比图片更好,因此你可以更加灵活、便捷的调整页…...

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C,其中项目 A 依赖 B,项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说,依赖的关系为:A—>B—>C, 那么我们执行项目 …...

Linux Centos7静默安装(非图形安装)Oracle RAC 11gR2(Oracle RAC 11.2.0.4)

Oracle RAC (全称Oracle Real Application Clusters )静默安装(非图形安装)教程。 由于这篇文章花费了我太多时间,设置了仅粉丝可见,见谅。 环境说明: 虚拟机软件:VMware Workstation 16 Pro…...

集成开发环境(IDE)介绍

集成开发环境(IDE)介绍 集成开发环境(Integrated Development Environment,IDE)是一种软件应用程序,用于开发和编写软件。常见的IDE包括Eclipse、Visual Studio、IntelliJ IDEA、Qt Creator等。 集成开发环…...

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)

一、项目介绍 在游乐场、商场、景区等人流量较大的地方,往往存在用户需要临时存放物品的情况,例如行李箱、外套、购物袋等。为了满足用户的储物需求,并提供更加便捷的服务体验,当前设计了一款物联网智能储物柜。 该智能储物柜通…...

12种常见的网络钓鱼

网络钓鱼是一种网络攻击,是指具有恶意动机的攻击者伪装欺骗人们并收集用户名或密码等敏感信息的一系列行为。由于网络钓鱼涉及心理操纵并依赖于人为失误(而不是硬件或软件漏洞),因此被认定为是一种社会工程攻击。 1. 普通网络钓鱼(群攻&…...

电商物流查询:未来的发展方向

在电商日益繁荣的时代,物流信息查询不仅关乎消费者体验,更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值,并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…...

【数据库原理】(25)数据完整性

一.完整性概述 数据库的完整性是保证数据正确性和一致性的关键。它防止数据库中存在不符合业务逻辑或语义规则的数据,避免错误信息的输入和输出。数据库的完整性和安全性不同,安全性关注的是防止非法用户的访问和恶意操作,而完整性则关注数据…...

逻辑运算符

逻辑运算符 什么是逻辑运算符&#xff1f; 在数学中&#xff0c;一个数据x大于5&#xff0c;小于15&#xff0c;我们可以这样来进行表示&#xff1a;5<x<15.在Java中&#xff0c;需要把上面的式子先进行拆解&#xff0c;再进行合并表达。 拆解为&#xff1a;x>5和 x…...

SpringBoot @RequestBody和@ResponseBody注解

1. RequestBody注解 用于将HTTP请求体的内容绑定到方法的参数上。通常情况下&#xff0c;我们使用这个注解来处理POST请求&#xff0c;特别是传递JSON格式的数据。 例&#xff1a; PostMapping("/user") public ResponseEntity<String> createUser(RequestB…...

LCD人体秤嵌入式方案全解析:从传感器到低功耗设计

1. 项目概述&#xff1a;从“称重”到“健康管理”的智能跨越“电子秤方案——LCD人体秤方案”这个标题&#xff0c;乍一看似乎只是关于一个简单的称重工具。但在这个全民关注健康、数据驱动生活的时代&#xff0c;一台现代的人体秤早已超越了“称体重”的单一功能。它集成了传…...

工业IoT实战:边缘计算+AI在电机预测性维护中的系统架构设计

前言工业物联网&#xff08;IIoT&#xff09;场景下&#xff0c;预测性维护&#xff08;Predictive Maintenance&#xff09;是AI技术落地价值最明确的方向之一。本文以杭州沃伦森&#xff08;WARENSEN&#xff09;电气的AIESA电机智能安康系统为案例&#xff0c;分析其在边缘计…...

linux学习笔记之linux文件管理

#文件系统及Shell的基本概念#文件及目录操作命令#VI的使用#软件包的管理一、文件系统及Shell的基本概念 1&#xff0e;文件系统的含义文件系统是用来管理和组织保存在磁盘驱动器上数据的系统软件 2&#xff0e;Linux的文件系统Linux系统采用虚拟文件系统技术&#xff08;VFS&am…...

脉冲相机与NeRF结合的高速场景三维重建技术

1. 高速场景重建的技术挑战与解决方案在计算机视觉领域&#xff0c;高速场景的三维重建一直是个棘手的问题。传统RGB相机受限于曝光时间和帧率&#xff0c;在拍摄快速运动物体时会产生严重的运动模糊。这种模糊不仅影响视觉效果&#xff0c;更会破坏三维重建所需的几何和纹理信…...

JMeter精准控制1 QPS的底层原理与三种实战方案

1. 这不是“设个线程数”就能搞定的事很多人第一次用Jmeter做压测&#xff0c;看到“我要每秒发1个请求”&#xff0c;第一反应是&#xff1a;开1个线程&#xff0c;Ramp-up时间设为1秒&#xff0c;循环次数设无限——结果一跑起来&#xff0c;发现TPS忽高忽低&#xff0c;有时…...

ARM处理器命名后缀解析与技术演进

1. ARM处理器命名后缀解析&#xff1a;从TDMI-S到T2F-S的技术演进作为一名长期从事嵌入式开发的工程师&#xff0c;我经常需要查阅ARM处理器的技术文档。初次接触ARM7TDMI-S、ARM926EJ-S这类命名时&#xff0c;那些神秘的字母后缀确实让人困惑。今天我们就来彻底拆解这些命名背…...

论文修改踩坑无数?paperxie 帮你一站式搞定查重与 AIGC 降重难题

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 作为一名被论文查重和 AIGC 检测反复折磨过的过来人&#xff0c;我深知毕业季里&#xff0c;对着飘红的查重报告和居高…...

把AI的能力拆成乐高积木:如何让Agent真正干成复杂的事

【AI Agent能不能干成复杂的事&#xff0c;不取决于模型有多聪明&#xff0c;而取决于能力怎么编排】AI Agent在2025年成为企业数字化领域的最热词汇。几乎所有企业都在讨论"上Agent"&#xff0c;但真正落地之后&#xff0c;大家发现一个尴尬的现实&#xff1a;简单的…...

医疗票据 OCR 识别 API 多场景落地指南:医保结算 + 商保理赔 + 医疗信息化(附 Python/Java 完整示例)

《医疗 OCR 识别 API 怎么选&#xff1f;&#xff08;报告单 / 发票 / 检测单&#xff09;》医疗票据 OCR 识别 API 多场景落地指南&#xff1a;医保结算 商保理赔 医疗信息化&#xff08;附 Python/Java 完整示例&#xff09; 导语&#xff1a;每天上万张医疗票据&#xff…...

寄存器文件与SRAM:芯片设计中存储层次的核心差异与选型指南

1. 项目概述&#xff1a;从“存储”到“访问”的鸿沟在数字电路和处理器设计的核心地带&#xff0c;有两个名字经常被提及&#xff0c;却又常常让初学者甚至一些从业者感到混淆&#xff1a;Register File&#xff08;寄存器文件&#xff09;和SRAM&#xff08;静态随机存取存储…...