PHP性能提升方案
一、背景与介绍
PHP语言开发效率高,特别应用于适合中小型项目,对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性,针对项目要适应高并发、高流量的访问特性,PHP确实在性能方面相对Go、Java存在一定的差距。
那真的这种情况,我们如何应对呢?
1、旧的PHP项目要全部推翻重构? 例如使用Go、Java重写,这个投入的开发成本和测试成本太高,老板基本上都不会采用这个方案的,除非他脑子有问题。 旧的项目至少还能跑,你这个上来就大刀阔斧搞革命,那真的要凉了。 所以这种方案是老板或者大领导下令决心重改,否则想都不要想。
2、旧项目找出存在性能瓶颈的接口,针对这些接口做优化,或者某些模块拆分微服务。 这种方案,我觉得至少比第一种方案可行。 因为根据二八定律, 百分之八十的访问流量决定在百分之二十的接口里面,所以要进行服务拆分或者重构,开发和测试的工作量要小N倍 。例如拆分出来的微服务,可以使用Go进行实现, 但是还是存在一定的开发工作量,队员要学习心得语言、学习新技术
3、直接找到一种方案,能够直接应用在当前项目,同时相对第二种方案的工作量更少。继续使用PHP开发,减少额外技术学习时间成本, 这个就是今天要讨论的主题。 其实也存在一些方案能针对PHP项目提速,改造工作量相对较少同时能提高性能。 例如接下来介绍的Laravel Octane、Swoole以及(衍生框架Hyperf、EasySwoole)、RoadRunner、FrankenPHP
二、提速方案
1、Laravel Octane
Laravel Octane通过使用高性能的应用程序服务器(包括FrankenPHP、Open Swoole、Swoole和RoadRunner)为您的应用程序提供服务,从而提高应用程序的性能。Octane引导您的应用程序一次,将其保存在内存中,然后以超音速向其提供请求。
官网: https://laravel.com/docs/11.x/octane#introduction
语言要求: PHP8.1+ 以上、Laravel10+
如果你正在使用的Laravel框架, 通过Laravel Octane的部署方式替换以往的Nginx+PHP-FPM方式,应该是比较方便的。 虽然说有版本限制,但是终归官方确实有这种提高性能的方式支持,可以一试.
Laravel Octane只是做了部署整合,底层还是使用的其它的引擎加速, 例如目前支持Swoole、RoadRunner、FrankenPHP的相关适配
2、Swoole以及衍生框架Hyperf、EasySwoole等
大名鼎鼎的Swoole就无需我都说了吧,韩天峰老师主导的开源项目,使用过PHP的基本上都有所耳闻。 使用Swoole或者衍生框架如Hyperf、EasySwoole等对PHP项目进行改造, 这样也是可以的,应该大部分的PHP代码逻辑是无需改动的,只需要改动部分代码方式,符合Swoole规范即可
3、RoadRunner
官网文档: https://roadrunner.dev/
github地址: https://github.com/roadrunner-server/roadrunner
RoadRunner是一款开源(MIT)高性能PHP应用服务器,使用Go编写并提供插件的进程管理器. 它支持作为服务运行,并能够使用插件在每个项目的基础上扩展其功能。
说白了,这个RoadRunner是Go编写的新版PHP-FPM, 可以针对PHP进程进行常驻运行,从而提高性能
4、FrankenPHP
官方文档: FrankenPHP: the modern PHP app server
github地址: https://github.com/dunglas/frankenphp
FrankenPHP是一个现代的PHP应用服务器,构建在Caddy web服务器之上。
FrankenPHP凭借其惊人的功能为您的PHP应用程序提供了超能力:早期提示、工作模式、实时功能、自动HTTPS、HTTP/2和HTTP/3支持…
FrankenPHP可与任何PHP应用程序配合使用,并使您的Laravel和Symfony项目比以往任何时候都更快,这要归功于它们与工作模式的官方集成。
FrankenPHP也可以作为一个独立的Go库,使用net/http将PHP嵌入任何应用程序中。
FrankenPHP也是Go语言编写、基于Caddy构建的PHP应用服务器。本质上还是通过Go的协程能力来管理PHP常驻进程,减少PHP进程针对框架每次都要重复加载,提高性能
三、总结
上述的这几种提高PHP运行性能方案,可以斟酌进行选择,找到属于自己项目合适的提速方案。无论任何的提速方案都会有一些开发和适配的工作量,只是看工作量大小和可控性,这个任何一种改造方案都无法避免的。
如果要大刀阔斧进行项目重构,使用Go进行重构是一个不错的方案。 因为Go和云原生K8S、Docker容器化关系相对紧密, 占用资源小、跨平台性也OK、开发效率也高。相对Java占用资源确实很大,JVM动不动就是1G起步是标配, Go用到500M都算大应用了, 不过这个看团队选择,没有绝对的最优解。
未来云原生肯定是潮流和趋势,体验过容器化的遍历,再让你回到物理机的部署方式十分难受。
既然是潮流风口,为什么不乘早一步到位呢? 雷军说, 站在风口,一头猪都能被吹起来! 我认为我们做程序的也可以适用这个方法论,选择正确的技术方向+努力,才会让技术能力变现!
相关文章:
PHP性能提升方案
一、背景与介绍 PHP语言开发效率高,特别应用于适合中小型项目,对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性,针对项目要适应高并发、高流量的访问特性,PHP确实在性能方面相对Go、J…...
关系(二)利用python绘制热图
关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…...
P8597 [蓝桥杯 2013 省 B] 翻硬币
# [蓝桥杯 2013 省 B] 翻硬币 ## 题目背景 小明正在玩一个“翻硬币”的游戏。 ## 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo&#x…...
主流公链 - Fantom
Fantom:高性能的区块链协议 Fantom是一种开创性的区块链协议,旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议:Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错(ABFT)共…...
vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现
1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…...
入门编程第一步,从记住这些单词开始
** 入门编程第一步,从记住这些单词开始 ** 2023-10-18 一、交互式环境与 print 输出 1、print : 打印/输出 2、coding : 编码 3、syntax : 语法 4、error : 错误 5、invalid : 无效 6、idenfifier : 名称/标识符 7、character : 字符 二、字符串的操作&#x…...
[C++]使用OpenCV去除面积较小的连通域
这是后期补充的部分,和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() {vector<vector<Point> > contours; //轮廓数组vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point&…...
vscode连接不上,终端ssh正常,一直输入密码正确但是无法登录
若是之前链结果突然等不上,使用第一个链接 若是第一次链接连不上,先使用第二个链接,在使用第一个链接 原因:原因是服务器端的wget命令不能使用,vscode需要服务器端下载个文件,无法下载就导致了如上的错误…...
Hive on Spark 配置
目录 1 Hive 引擎简介2 Hive on Spark 配置2.1 在 Hive 所在节点部署 Spark2.2 在hive中创建spark配置文件2.3 向 HDFS上传Spark纯净版 jar 包2.4 修改hive-site.xml文件2.5 Hive on Spark测试2.6 报错 1 Hive 引擎简介 Hive引擎包括:MR(默认)…...
ROS 基本
ROS创建自己的功能包 ROS中工作空间(workspace)是一个存放工程开发相关文件的文件夹,其中有四个文件夹。 src:代码空间(Source Space)build:编译空间(Build Space)devel:开发空间(Development Space)install:安装空间(Install Space) OK接下来创作工作空间&#…...
Pygame基础9-射击
简介 玩家用鼠标控制飞机(白色方块)移动,按下鼠标后,玩家所在位置出现子弹,子弹匀速向右飞行。 代码 没有什么新的东西,使用两个精灵类表示玩家和子弹。 有一个细节需要注意,当子弹飞出屏幕…...
Ps:颜色查找
颜色查找 Color Lookup命令通过应用预设的 LUT 来改变图像的色彩和调性,从而为摄影师和设计师提供了一种快速实现复杂色彩调整的方法,广泛应用于颜色分级、视觉风格的统一和创意色彩效果的制作。 Ps菜单:图像/调整/颜色查找 Adjustments/Colo…...
vue3+vite 模板vue3-element-admin框架如何关闭当前页面跳转 tabs
使用模版: 有来开源组织 / vue3-element-admin 需要关闭的.vue 页面增加以下方法 //setup 里import {LocationQuery, useRoute, useRouter} from "vue-router"; const router useRouter(); function close() {console.log(|--router.currentRoute.value, router.cur…...
JavaScript 对象管家 Proxy
JavaScript 在 ES6 中,引入了一个新的对象类型 Proxy,它可以用来代理另一个对象,并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人,其提供了一个捕捉器函数,可以在代理对象上拦截…...
Qt + Vs联合开发
Qt + Vs联合开发 文章目录 Qt + Vs联合开发环境说明VS+Qt安装注意事项QtCreator msvc编译器配置Visual Studio 2019 + Qt 5.12.10Visual Studio 2015 + Qt5.12.10VsQt环境配置安装插件 Qt Visual Studio Tools插件配置Qt创建项目Vs创建Qt项目VsQt工程转换Vs工程转Qt工程Qt工程转…...
开源知识库平台Raneto--使用Docker部署Raneto
文章目录 一、Raneto介绍1.1 Raneto简介1.2 知识库介绍 二、阿里云环境2.1 环境规划2.2 部署介绍 三、环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Raneto镜像五、部署Raneto知识库平台5.1 创建挂载目录5.2 编辑config.js文件5.3 编…...
鸿蒙原OS开发实例:【ArkTS类库单次I/O任务开发】
Promise和async/await提供异步并发能力,适用于单次I/O任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。 实现单次I/O任务逻辑。 import fs from ohos.file.fs; import common from ohos.app.ability.common;async function write(data:…...
C语言:二叉树的构建
目录 一、二叉树的存储 1.1 顺序存储 1.2 链式存储 二、二叉树的顺序结构及实现 2.1堆的概念及结构 2.2堆的构建 2.3堆的插入 2.4堆顶的删除 2.5堆的完整代码 三、二叉树的链式结构及实现 3.1链式二叉树的构建 3.2链式二叉树的遍历 3.2.1前序遍历 …...
软件测试工程师面试汇总功能测试篇
Q:一、进行测试用例设计的时候用到的方法有哪些? A:最常使用的测试用例设计方法包括等价类划分法、边界值分析方法、场景法、错误推测法。其中,最容易 发现错误的是边界值法,使用最多的是场景法。以注册为例:首先从需求确定用户名…...
javaAPI1
API application pragramming interface 应用程序编程接口 除java.lang包以外,其他包中的类在使用时需要导入 建包 package com.abc.javabean; 导包格式,import 包名.类名 API使用技巧 1,先看关键字 2,看参数列表 3,看返回值类型 String 封装字符串和处理字符串的类…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
