项目性能优化的指标,目标

性能优化的终极目标是什么性能优化的目标实际上是为了更好的用户体验一般我们认为用户体验是下面的公式:用户体验 = 产品设计(非技术)+ 系统性能 ≈ 系统性能 = 快那什么样的体验叫快呢?3秒定理 一般我们认为网站页面的加载速度在3秒以内就可以称作合格了,加载速度越趋近于0,越快。 3秒定理:Strangeloop在对比了众多网站,并对其性能进行分析之后得出了一个著名的3秒定理,当网站页面加载速度超过3秒后,57%的访客会离开这个网站。  如果想让我们的系统快起来,就要做性能调优。项目性能优化以下可以做为优化的标准:前端工程师:首屏时间、白屏时间、可交互时间、完全加载时间;移动端工程师:端到端响应时间、Crash率、内存使用率、FPS;后端工程师:RT、TPS、并发数。影响因素1:数据库读写、RPC、网络IO、逻辑计算复杂度、缓存影响因素2:JVM[Throughput吞吐量、Footprint访存足迹、Latency延迟]影响性能的关键要素产品设计:产品逻辑、功能交互、动态效果、页面元素基础网络:网络=连接介质+计算终端代码质量&架构移动端环境:设备类型&性能、网络...

PHP,Golang,前端,.Net,解决方案,其他 2024-03-12 PM 27次 0条

微信报错提示 missing prepayid 解决方案

 在对接微信相关支付时,有时候会遇到 missing prepayid 错误,这种错误没有实际的提示信息,一般需要我们逐步排查或者开启日志记录记录详细的错误信息。 解决步骤首先我们反复确保了公钥以及私钥生成正确。确保配置信息填写正确检查相关支付是否已经开通检查商户号是否已经关联对应应用清理并重新生成用户openid和unionid使用对应微信登录的账号进行调取支付问题原因用户unionid或者openid与当前微信不匹配导致,重新清理获取即可此商家的收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案。 最后我们发现是由 第五和第六条原因造成的,我们将用户 openid 和 unionid 清理后使用微信登录重新生成然后直接发起支付,这个时候就不在提示 missing prepayid 错误了。 当然了还有一部分情况是因为 此商家的收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案。 导致的。 以上就是我们解决微信报错提示 missing prepayid 解决方案,有遇到同样问题的朋友,...

PHP,解决方案 2024-01-05 AM 190次 0条

Redis 提示 protocol error, got 'u' as reply type byte 解决方案

 遇到一个奇怪的问题,在 php 中使用 workerman 或者传统 pcntl_fork 的开启子进程时 大约十几分钟就会出现一段异常报错 protocol error, got 'u' as reply type byte 初步诊断是redis提示的 大致意思是 协议错误,得到'u'作为回复类型字节 。异常信息protocol error, got 'u' as reply type byte通过代码排查以及报错提示初步判断是redis的问题原因分析 传统 cli 下不会出现这个问题,只有 workerman 下以及 pcntl_fork 的开启子进程时 十几分钟后才会出现。 已知 workerman 底层使用的也是 pcntl_fork 我们直接分析这个函数。 pcntl_fork 函数 先创建主进程然后在根据需要创建N个子进程,而redis使用 单例模式 或者使用 static 来进行保存连接对象时候并且在主线程内有创建这个连接,那么就会出现以上 protocol error, got 'u' as reply type byte 错误 这种异常一般称为...

PHP,Linux,解决方案,其他 2023-12-18 PM 118次 0条

php打包扩展zephir避坑安装指南

 本文主要记录了zephir各种安装失败,打包失败的正确姿势,完美解决各个版本php打包php打包扩展zephir避坑安装指南,一旦拥有别无所求。参考文档zephir官方网站zephir官方中文文档zephir中文文档(备用)")使用系统镜像 我们使用2207版本centos7安装系统CentOS-7-x86_64-Minimal-2207-02.iso系统环境 我们通过宝塔面板来安装指定php版本,当然你也可以使用其他方式安装。宝塔安装Git 如果提示找不到git命令我们可以通过以下命令安装一下gityum install gitzephir安装步骤首先我们来到系统根目录将 php-zephir-parser 通过 Git 方式 Clone 下来githubgit clone https://github.com/zephir-lang/php-zephir-parsergiteegit clone https://gitee.com/laiwi/php-zephir-parser.git国内 Clone 失败可以使用 gitee安装编辑PHP环境zephir_parser.s...

PHP,Linux,解决方案 2023-06-16 AM 327次 0条

解决Liunx安装找不到最新版本软件方案

 我们在使用linux,centos等系统想要安装最新版软件时候发现无论怎安装都是老版本的软件,下面我们通过安装 PHP8.1 , php-devel 等软件来演示一下怎么将linux软件库更新到最新版本。步骤下面我们使用 centos7 来作为演示系统查看当前系统软件库列表 我们通过以下命令可以查看更新之前的软件库内软件的版本。sudo yum search all php-devel 一般情况下 新安装的系统软件库版本比较老旧并没有最新版本的软件。安装 epel-releasesudo yum install epel-release安装最新版 remi 源 Remi 源大家或许很少听说,但是我们强烈推荐,尤其对于不想编译最新版的 Linux 使用者, 因为 Remi 源中的软件几乎都是最新稳定版。sudo yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm安装 yum-utilssudo yum -y install yum-utils最后我们再次查看当前系统软...

PHP,Golang,Linux,解决方案 2023-06-13 PM 275次 0条

令牌桶限流算法

 下面我们通过使用redis实现一个简单通用的令牌桶限流算法解决问题 令牌桶算法主要是以桶的容量为基准,以固定的时间来生产令牌,有效的解决了漏桶效率不高的问题具体实现创建redis对象并定义缓存键$redis = $this->connect(); $key = "aaaaa";开启 watch 并定义定义每分钟最大请求数量$current_time = time(); $max_count = 320; $total_s = 60; $redis->watch($key);计算平均值用于限制每秒请求数量$rate = (int)(($max_count / $total_s) * ($current_time - ¥result_array["time"]));取出最大容量与桶内容量最小值$num = min($max_count, ($result_array["num"] + $rate));判断令牌数/* 令牌小于0 */ if ($num <= 0) { return false; }重新保存令牌$result = json_encode(["num" =>...

PHP,Golang,.Net,解决方案,其他 2023-03-21 AM 319次 0条

实现滑动窗口限流算法

 下面我们通过php使用redis实现一个简单通用的滑动窗口限流算法解决问题 滑动窗口算法主要解决了传统计数限流算法的阶段突发性流量问题。具体实现创建redis对象并定义缓存键$redis = new \Redis(); $redis->connect("127.0.0.1"); $key = "aaaaa";定义每分钟最大请求数量$max_count = 320; $total_s = 60; $current_time = time();计算平均值用于限制每秒请求数量$avg_count = ceil($max_count / $total_s);限制每秒请求数量$range_count = $redis->zRangeByScore($key, $current_time, $current_time); if (count($range_count) > $avg_count) { exit('请求太过频繁,请稍后 -1'); }限制每分钟请求数量$redis->zRemRangeByScore($key, 0, $current_time - 59); $c...

PHP,Golang,前端,.Net,解决方案,其他 2023-03-17 PM 339次 0条

PHP后端面试题

分享下频繁出现的php后端面试笔试题简单描述php8,php7以及之前版本的区别php-fpm fast-cgi cgi 的关系self,this,static分别代表着什么,在什么场景下使用程序中出现高热点数据时会遇到什么问题,怎么解决导出或导入百万级数据会出现什么样的问题,怎么解决在 mvc 中 controller , model , logic , service 之间的关系以及使用场景简单描述下控制翻转,依赖注入,和容器实现原理Db和Model的区别workman和swoole的区别简述几个设计默认以及是实现原理mysql中 innodb 和 myisam 的区别以及使用场景mysql 常用数据库引擎有哪些mysql中 utf8和utf8mb4的区别mysql中 超长度数据段如何根据完整数据快速查询主键、外键和索引的区别简单描述下联合索引和索引mysql常见优化方式简单描述下悲观锁和乐观锁会员表无限级关系储存解决方案简单描述redis和mongodb,memcacahe有什么区别以及常见使用场景redis单线程有什么优势和缺点简单描述下队列实现原理系统大流量解决方案请...

PHP 2023-01-09 AM 289次 0条

PHP常见机试题

记录下频繁出现的php基础面试题时间计算$starttime为手动输入 如: 2020-10-101.1 计算出来 $starttime 的当月开始时间 1号0点0分0秒的时间戳1.2 计算出来 $starttime 的上月开始时间 1号0点0分0秒的时间戳1.3 计算出来 $starttime 的上上月开始时间 1号0点0分0秒的时间戳1.4 计算出来 $starttime 的上上月结束时间最后一天号23点59分59秒的时间戳字符串处理2.1 字符串双向替换如: 我喜欢你 替换为 你爱我 分别替换了 我,你,爱和喜欢2.2 将任意英文字符串转换为小驼峰如: My is name 或者 My_is_name2.3 计算任意两个字符串的相似度百分比数据爬虫3.1 爬取任意网页单页面图片到本地3.2 爬取并过滤单页面所有图片标签并替换为

PHP 2023-01-04 AM 291次 0条

解决tp5,tp6,fastadmin框架api或者其他模块获取不到语言包问题

 分享下解决了在 api 模块或者其他任意自定义模块 模型获取不到语言包无法转换或者多模块公用一个语言包问题示例 主要默认加载了admin模块下的语言包 在基类或者当前类里面加入即可public function __construct($data = []) { parent::__construct($data); $this->loadlang(mb_strtolower(class_basename(static::class))); } /** * 加载语言文件 * @param string $name */ protected function loadlang($name) { $name = Loader::parseName($name); $name = preg_match("/^([a-zA-Z0-9_\.\/]+)\$/i", $name) ? $name : 'index'; $lang = request()->langset(); $lang = preg_match("/^([a-zA-...

PHP,解决方案 2022-11-09 PM 317次 0条