首页 > 编程语言 >对于耗时比较长的程序,比如请求外部链接,为什么swoole比php-fpm并发好

对于耗时比较长的程序,比如请求外部链接,为什么swoole比php-fpm并发好

时间:2024-05-06 17:13:10浏览次数:21  
标签:初始化 PHP 请求 Swoole fpm swoole Worker 进程 php

Swoole相比PHP-FPM在处理耗时较长的程序,如请求外部链接时表现出更高的并发能力,原因主要包括以下几点:

1. **常驻内存**:Swoole是一个高性能的异步并发框架,它以扩展的形式运行在PHP中,能够将PHP程序常驻在内存中。这意味着Swoole的服务一旦启动,就会持续运行,不需要为每个请求创建和销毁PHP解释器,大大减少了进程初始化和销毁的开销。

2. **异步非阻塞IO**:Swoole采用了异步非阻塞I/O模型,能够在等待I/O操作(如网络请求、数据库查询等)完成的同时处理其他任务,而不是像PHP-FPM那样在等待期间阻塞进程。这种机制使得Swoole能够高效地处理并发请求,即使单个请求需要较长时间完成。

3. **事件驱动**:Swoole基于事件驱动,通过Reactor线程/进程模型监听和分发事件,当有新的连接请求或者已有连接的数据可读写时,立即触发回调函数处理,无需为每个连接创建独立的线程或进程,从而降低了资源消耗,提升了并发处理能力。

4. **协程支持**:Swoole还支持协程,允许在单一线程内以非阻塞的方式处理大量并发请求。协程能够在不增加线程或进程的情况下实现并发,让资源利用更加高效,特别适合处理I/O密集型任务,如频繁的网络请求。

5. **Task Worker**:Swoole提供了Task Worker,专门用于处理CPU密集型或耗时较长的任务。Task Worker可以从主线程接过任务后异步处理,不影响主线程继续接受新的网络请求,保证了整体的并发性能。

相比之下,PHP-FPM使用的是Master/Worker模型,每个Worker进程在处理请求时是同步且阻塞的。一旦遇到耗时操作,如请求外部链接,该Worker进程会一直等待直到操作完成,期间无法处理其他请求,这在高并发场景下会导致资源快速耗尽,影响整体的并发性能。

因此,对于需要处理大量并发请求且涉及耗时操作的应用,Swoole凭借其异步非阻塞和事件驱动的特性,能够提供显著优于PHP-FPM的并发处理能力。

 

 

当PHP-FPM配合OPcache使用时,确实可以在一定程度上减少加载和初始化PHP环境的开销,但并不能完全消除这一过程。

OPcache是一个PHP扩展,它的主要作用是将PHP脚本预编译后的opcode(操作码)缓存到共享内存中,这样当同一个脚本再次被请求时,可以直接从内存中读取opcode并执行,而无需重新解析PHP源代码文件。这样一来,大大减少了文件读取、语法解析和编译的时间,提升了脚本的执行效率。

然而,即使启用了OPcache,每次PHP-FPM的Worker进程处理请求时,仍需经历一些基本的初始化步骤,比如:

- **初始化环境**:包括加载PHP配置文件(php.ini)、注册扩展、初始化模块等。
- **进程上下文**:每个Worker进程都需要自己的内存空间来存储变量、环境变量等,这是在进程启动时初始化的。
- **资源分配**:为每个进程分配文件描述符、内存限制等资源。

OPcache减少了脚本解析和编译的开销,但这些初始化步骤和资源分配仍然是存在的。相较于没有OPcache的情况,使用OPcache可以显著提高脚本的加载速度,尤其是在频繁请求相同脚本的场景下,但并不能完全消除每次请求时的环境加载和初始化开销。而常驻内存的框架如Swoole,由于程序一直运行在内存中,这部分开销则可以进一步减少。

 

 

Swoole 在其工作方式上与 PHP-FPM 不同,它确实能更有效地减少环境加载和初始化的开销。Swoole 作为一个异步并发框架,其核心特性之一就是将 PHP 应用程序常驻在内存中运行。这意味着一旦 Swoole 服务器启动,就不需要为每个请求重复加载 PHP 环境和初始化应用代码。以下是 Swoole 如何减少这些开销的几个关键点:

1. **常驻内存**:Swoole 服务器启动后,会将 PHP 代码及其依赖加载到内存中,之后的请求不再需要重复加载和解析 PHP 文件,这大大减少了启动时的开销。

2. **进程模型**:Swoole 使用 Master-Worker 进程模型,其中 Master 进程负责监听端口和分发任务,Worker 进程(包括 Task Worker)处理实际的请求。Worker 进程在启动时完成初始化,之后可以复用以处理多个请求,无需为每个请求创建新的进程或线程,从而减少了初始化开销。

3. **事件驱动**:Swoole 采用事件驱动模型,能够在一个 Worker 进程内非阻塞地处理多个并发请求,这与 PHP-FPM 的阻塞模型形成对比,在 PHP-FPM 中每个请求通常需要独立的进程处理。

4. **热重载**:虽然不是直接减少初始化开销,但 Swoole 支持在运行时动态加载和更新代码,这意味着在不重启整个服务器的情况下,可以更新部分应用代码,这对于开发和维护阶段非常有用。

尽管如此,Swoole 仍然存在一定的初始化成本,尤其是在 Worker 进程启动时,需要执行一些初始化代码和加载依赖。不过,这部分开销在整个应用程序生命周期中只会发生一次或少数几次(如 Worker 进程重启时),相比于 PHP-FPM 每个请求都要加载和初始化环境,Swoole 的整体效率要高得多。

标签:初始化,PHP,请求,Swoole,fpm,swoole,Worker,进程,php
From: https://www.cnblogs.com/maidongdong/p/18175418

相关文章

  • 用php找出字符串中连续重复次数最多的字符,你有方法吗?
     找出字符串中连续重复次数最多的字符,这里总结了几种方法,不管是在开发中,还是在面试中都会遇到。方法一<?php$arr=str_split($str);//字符串分隔到数组中$arr=array_count_values($arr);//用于统计数组中所有值出现的次数,返回一个数组//键名为原数组的键值,键值为......
  • PHP-数据对象学习手册(全)
    PHP数据对象学习手册(全)原文:zh.annas-archive.org/md5/33ff31751d56930c46ef1daf9ca0ebcb译者:飞龙协议:CCBY-NC-SA4.0前言本书将向您介绍PHP5.0版本开始提供的最重要的扩展之一——PHP数据对象,通常称为PDO。PHP由于其简单性和易用性而成为非常流行的Web编程语言......
  • PHP-入门指南(全)
    PHP入门指南(全)原文:zh.annas-archive.org/md5/d36bde355b2574844946c8150420db7b译者:飞龙协议:CCBY-NC-SA4.0前言开发网站是当今的优先事项,以便您的业务在互联网上有所存在。设计和开发是任何网站的基础步骤。PHP通常用于网站和Web应用程序开发。PHP是一种通用的服务......
  • 使用-PHP-和-jQuery-构建游戏化-Web-站点(全)
    使用PHP和jQuery构建游戏化Web站点(全)原文:zh.annas-archive.org/md5/a9c92181e14a72b81ed3a8d14d6790a1译者:飞龙协议:CCBY-NC-SA4.0前言几年前,如果你对某人说“游戏化”,你会得到一个奇怪的表情,好像你在编造一些新东西。也许你会得到一个快速的跟进问题:“嗯?那是什么?”......
  • im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发
    即时通讯(IM)系统是现代互联网应用中不可或缺的一部分,它允许用户进行实时的文本、语音、视频交流。随着技术的发展,IM系统的功能越来越丰富,如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统,包括源码解析、系统架构、关键功能实现等。仓库源码:ym.fz......
  • php合并时间区间
    需要写一段合并时间区间的代码,写个demo记录下<?php$arr=[["2024-04-1611:25:46","2024-04-1612:19:21"],["2024-04-1603:14:06","2024-04-1610:13:21"],["2024-04-1613:14:59","2024-04-1615:44:46"],......
  • php反序列化gc
    通过一道题来边看边讲php中的zval容器和gc回收机制ezpop<?phperror_reporting(0);highlight_file(__FILE__);classAAA{public$s;public$a;publicfunction__toString(){echo"youget2A<br>";$p=$this->a;r......
  • 基于Hyperf的CMS,企业官网通用php-swoole后台管理系统
    2023年9月11日10:47:00仓库地址:https://gitee.com/open-php/zx-hyperf-cmsCMS,企业官网通用PHP后台管理系统框架介绍hyperfSCUI后端开发组件php8.1hyperf3.1数据库sql(使用最新日期文件)hyperf\doc\sql_bakmysql8.系统默认账号密码:admin/admin前端开发组件scui......
  • PHP框架Laravel+Vue3+前后端分离开发模式+实战项目
    1、本实战项目采用前后端分离的开发模式,前端框架vue3,后端框架laravel10。所谓的前后端分离的开发,就是有别于利用cookie,session的基于会话机制的开发模式;前后端分离的开发模式是基于jwt的开发模式,也就是说后端的接口数据不仅可以支持web页面,也可以支持微信小程序,公众号,app等移动端......
  • PHP mysql 大量批量insert或update数据出错问题
    UPDATEusersSETage=30WHEREname='Alice';UPDATEusersSETage=25WHEREname='Bob';UPDATEusersSETage=35WHEREname='Charlie';以上代码会导致并发性问题,因为多个更新语句可能会同时执行,导致数据错乱。解决办法:1、使用锁定LOCKTABLESusersWRIT......