首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
142 阅读
2
php接口优化 使用curl_multi_init批量请求
132 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
102 阅读
5
PHP 文件I/O
89 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
785
篇文章
累计收到
8
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
785
篇与
的结果
2023-11-21
Nginx配置性能优化的方法
Nginx配置性能优化的方法在大多数情况下,一个常规安装的Nginx对你的网站来说已经能很好地工作了。然而,如果你真的想挤压出Nginx的性能,你必须更深入一些。在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能。需要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些可以通过微调来提高性能设置的概述。你的情况可能不同。基本的 (优化过的)配置我们将修改的唯一文件是Nginx.conf,其中包含Nginx不同模块的所有设置。你应该能够在服务器的/etc/nginx目录中找到nginx.conf。首先,我们将谈论一些全局设置,然后按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。高层的配置Nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上。user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同。worker_processes 定义了nginx对外提供web服务时的worker进程数。这个值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。worker_rlimit_nofile 更改worker进程的打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。Events模块events模块中包含Nginx中所有处理连接的设置。events { worker_connections 2048; multi_accept on; use epoll; } worker_connections 设置可由一个worker进程同时打开的*连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。记住,*客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。(值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)HTTP 模块HTTP模块控制着Nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; ... } server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。sendfile 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。access_log off; error_log /var/log/nginx/error.log crit; access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)error_log 告诉nginx只能记录严重的错误:keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; keepalive_timeout 给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。client_header_timeout 和 client_body_timeout 设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。reset_timeout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。limit_conn 为给定的key设置*连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。include /etc/nginx/mime.types; default_type text/html; charset UTF-8; include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。default_type 设置文件使用的默认的MIME-type。charset 设置我们的头文件中的默认的字符集gzip on; gzip_disable "msie6"; # gzip_static on; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 4; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用*压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们*不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比*的。我们设置为4,这是一个比较折中的设置。gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。# cache informations about file descriptors, frequently accessed files # can boost performance, but you need to test those values open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; ## # Virtual Host Configs # aka our settings for specific servers ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; open_file_cache 打开缓存的同时也指定了缓存 数目,以及缓存的时间。我们可以设置一个相对高的时间,这样我们可以在它们不活动超过20秒后清除掉。open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。一个完整的配置user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 2048; multi_accept on; use epoll; } http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 编辑完配置后,确认重启nginx使设置生效。
2023年11月21日
42 阅读
0 评论
0 点赞
2023-11-21
前端懒加载
前端懒加载一、什么是懒加载?什么预加载?概念:懒加载 也叫做延迟加载、按需加载,指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。 有的网站图片很多,而如果一上来就加载所有的图片,会导致网页加载很慢; 图片懒加载:等图片正式进入到可视区中时,才加载对应的图片,否则不请求图片预加载 指的是将所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。通过预加载能够减少用户的等待时间,提高用户的体验。我了解的预加载的最常用的方式是使用 js 中的 image 对象,通过为 image 对象来设置 scr 属性,来实现图片的预加载。懒加载和预加载的区别区别:两者的行为是相反的,预加载是提前加载,懒加载是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。意义:懒加载:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。预加载:预加载可以说是牺牲服务器前端性能,换取更好的用户体验,这样可以使用户的操作得到最快的反映。网站正常加载和预加载预加载则是指在用户访问网站之前,网站会提前加载一些可能会用到的文件,以提高用户体验和页面加载速度。这些文件可能是网站的核心资源,或者是用户可能会访问的页面的文件,例如首页的图片、CSS 文件等。预加载可以通过一些技术手段来实现,比如使用预加载标签 预加载资源。网站正常加载是按需加载,而预加载则是提前加载可能会用到的文件,以提高用户体验。二、图片懒加载的基本实现图片的加载是由src引起的,当对src赋值时,浏览器就会请求图片资源。根据这个原理,我们使用HTML5的data-xxx属性来储存图片的路径,在需要加载图片的时候,将data-xxx中图片的路径赋值给src,这样就实现了图片的按需加载,即懒加载。注意:data-xxx中的xxx可以自定义,这里我们使用data-src来定义。懒加载的实现重点在于确定用户需要加载哪张图片,在浏览器中,可视区域内的资源就是用户需要的资源。所以当图片出现在可视区域时,获取图片的真实地址并赋值给图片即可。<div class="container"> <img src="loading.gif" data-src="pic.png"> <img src="loading.gif" data-src="pic.png"> <img src="loading.gif" data-src="pic.png"> <img src="loading.gif" data-src="pic.png"> <img src="loading.gif" data-src="pic.png"> <img src="loading.gif" data-src="pic.png"> </div> <script> var imgs = document.querySelectorAll('img'); function lozyLoad(){ var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; var winHeight= window.innerHeight; for(var i=0;i < imgs.length;i++){ if(imgs[i].offsetTop < scrollTop + winHeight ){ imgs[i].src = imgs[i].getAttribute('data-src'); } } } window.onscroll = lozyLoad(); </script> 三、Intersection Observer实现图片懒加载Intersection Observer是HTML5新增的API,可以用来实现图片懒加载。MDN中对Intersection Observer的解释IntersectionObserver接口 (从属于Intersection Observer API) 提供了一种异步观察目标元素与其祖先元素或顶级文档视窗(viewport)交叉状态的方法。祖先元素与视窗(viewport)被称为根(root)当一个IntersectionObserver对象被创建时,其被配置为监听根中一段给定比例的可见区域。一旦IntersectionObserver被创建,则无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;然而,你可以在同一个观察者对象中配置监听多个目标元素。这里封装一个组件并且自定义一个v-lazy属性,然后替换到src上,实现懒加载。import { useIntersectionObserver } from "@vueuse/core"; import defaultImg from '@/assets/images/200.png' import { App } from 'vue'; export default { install(app: App) { // 全局指令 app.directive('lazy', { // mounted 是 v3 中自定义指令的生命周期,他会被自动调用 // 它表示的含义和组件的mounted是一样的 // el是 dom 元素, binding mounted(el, binding) { el.src = defaultImg console.log('lazy', el, binding.value); //实时鉴定el是否可见, 如果可见 给它的src设置binding.value const { stop } = useIntersectionObserver(el, ([{ isIntersecting }]) => { if (isIntersecting) { el.src = binding.value stop() el.onerror = function () { el.src = defaultImg } } }) } }) } } <img v-lazy="item.picture" alt=""/>四. 延迟加载视频图片和视频这类静态资源资源占比都最大。与图片一样,视频同样可以延迟加载,来达到优化性能的目的。正常情况下加载视频,使用的是 video 标签,那么对于一些需要由用户自己播放的视频,最好指定video标签的preload属性为none,这样浏览器就不会预加载任何视频数据。为了占用空间,使用poster属性为video占位。如下:<video controls preload="none" poster="replace.jpg"> <source src="main.webm" type="video/webm"> <source src="main.mp4" type="video/mp4"> </video>五. 使用第三方延迟加载库除了上面介绍的一些延迟加载方法之外,还可以借助一些已经封装好的第三方库,下面是一些成熟的第三方库: lozad.js 是超轻量级且只使用 Intersection Observer 的库, 因此它的性能极佳,但如果要在旧版本浏览器上使用,则需要配置polyfill。 lazysizes 是功能全面的延迟加载库,其使用的模式与本文所示的代码示例非常相似,会自动与元素上的lazyload 类绑定,然后在data-src 和/或 data-srcset 属性中指定图像网址,该库还可以通过许多插件进行扩展,执行延迟各种资源等操作。 如果使用React,可以使用 react-lazyload来进行图片懒加载操作,这个库是React图片懒加载的主流解决方案。
2023年11月21日
34 阅读
0 评论
0 点赞
2023-11-21
CDN加速原理
CDN加速原理共享单车刚兴起的时候,喊出的是要解决大家最后一公里的问题。那么在互联网中,我们则需要来解决“第一公里“”的问题,也就是CDN对网络优化的作用。一、什么是 CDNCDN的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。 简单的说,CDN的工作原理就是将您源站的资源缓存到位于全球各地的CDN节点上,用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都回您的源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验CDN对网络的优化作用主要体现在如下几个方面解决服务器端的“第一公里”问题缓解甚至消除了不同运营商之间互联的瓶颈造成的影响减轻了各省的出口带宽压力缓解了骨干网的压力优化了网上热点内容的分布二、CDN工作原理传统访问过程由上图可见,用户访问未使用CDN缓存网站的过程为:1.用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址. 2.LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期) 3.ROOT DNS将域名授权dns记录回应给 LocalDns 4.LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址 5.域名授权dns 查询域名记录后,回应给 LocalDns 6.LocalDns 将得到的域名ip地址,回应给 用户端 7.用户得到域名ip地址后,访问站点服务器 8.站点服务器应答请求,将内容返回给客户端.CDN访问过程通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为:1.用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址. 2.LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期) 3.ROOT DNS将域名授权dns记录回应给 LocalDns 4.LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址 5.域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns 6.LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址 7.智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns 8.LocalDns 将得到的域名ip地址,回应给 用户端 9.用户得到域名ip地址后,访问站点服务器 10.CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)通过以上的分析我们可以得到,为了实现对普通用户透明(使用缓存后用户客户端无需进行任何设置)访问,需要使用DNS(域名解析)来引导用户来访问Cache服务器,以实现透明的加速服务. 由于用户访问网站的第一步就是域名解析,所以通过修改dns来引导用户访问是最简单有效的方式.CDN网络的组成要素对于普通的Internet用户,每个CDN节点就相当于一个放置在它周围的网站服务器. 通过对dns的接管,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求. 由于它离用户更近,因而响应时间必然更快.从上面图中 虚线圈起来的那块,就是CDN层,这层是位于 用户端 和 站点服务器 之间.智能调度DNS(比如f5的3DNS) 智能调度DNS是CDN服务中的关键系统.当用户访问加入CDN服务的网站时,域名解析请求将最终由 “智能调度DNS”负责处理。它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。同时它需要与分布在各地的CDN节点保持通信,跟踪各节点的健康状态、容量等信息,确保将用户的请求分配到就近可用的节点上.缓存功能服务 负载均衡设备(如lvs,F5的BIG/IP) 内容Cache服务器(如squid) 共享存储三、名词解释CNAME记录(CNAME record)CNAME即别名( Canonical Name );可以用来把一个域名解析到另一个域名,当 DNS 系统在查询 CNAME 左面的名称的时候,都会转向 CNAME 右面的名称再进行查询,一直追踪到最后的 PTR 或 A 名称,成功查询后才会做出回应,否则失败。 例如,你有一台服务器上存放了很多资料,你使用docs.example.com去访问这些资源,但又希望通过documents.example.com也能访问到这些资源,那么你就可以在您的DNS解析服务商添加一条CNAME记录,将documents.example.com指向docs.example.com,添加该条CNAME记录后,所有访问documents.example.com的请求都会被转到docs.example.com,获得相同的内容。CNAME域名接入CDN时,在CDN提供商控制台添加完加速域名后,您会得到一个CDN给您分配的CNAME域名, 您需要在您的DNS解析服务商添加CNAME记录,将自己的加速域名指向这个CNAME域名,这样该域名所有的请求才会都将转向CDN的节点,达到加速效果。DNSDNS即Domain Name System,是域名解析服务的意思。它在互联网的作用是:把域名转换成为网络可以识别的ip地址。人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。比如:上网时输入的www.baidu.com会自动转换成为220.181.112.143。 常见的DNS解析服务商有:阿里云解析,万网解析,DNSPod,新网解析,Route53(AWS),Dyn,Cloudflare等。回源host回源host:回源host决定回源请求访问到源站上的具体某个站点。例子1:源站是域名源站为www.a.com,回源host为www.b.com,那么实际回源是请求到www.a.com解析到的IP,对应的主机上的站点www.b.com例子2:源站是IP源站为1.1.1.1, 回源host为www.b.com,那么实际回源的是1.1.1.1对应的主机上的站点www.b.com协议回源指回源时使用的协议和客户端访问资源时的协议保持一致,即如果客户端使用 HTTPS 方式请求资源,当CDN节点上未缓存该资源时,节点会使用相同的 HTTPS 方式回源获取资源;同理如果客户端使用 HTTP 协议的请求,CDN节点回源时也使用HTTP协议。
2023年11月21日
38 阅读
0 评论
0 点赞
2023-11-21
使用XHProf查找PHP性能瓶颈
使用XHProf查找PHP性能瓶颈XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。下载网上很多是编译安装xhprof-0.9.4版本,应该是用php5,在php8.0下编译xhprof-0.9.4各种报错(编译安装这个拓展 tideways 不会报错),php7、php8环境下,建议下载最新版本https://pecl.php.net/package/xhprof安装Xhprof扩展cd /opt wget https://pecl.php.net/get/xhprof-2.3.9.tgz tar -zxvf xhprof-2.3.9.tgz cd xhprof-2.3.9 cd extension/ phpize ./configure make && make install修改php.ini[xhprof] extension=xhprof.so xhprof.output_dir=/tmp配置中xhprof.output_dir指定了生成的profile文件存储的位置,我们将其指定为/tmp。对PHP进行性能分析在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析。xhprof_enable/xhprof_sample_enable函数用于开始XHProf性能分析,区别在于前者功能更加强大,而后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。xhprof_disable/xhprof_sample_disable函数用于停止性能分析,并返回分析的数据。需要特别说明的函数是xhprof_enable,其他函数都是不需要提供参数的,而该函数则可以接受两个可选的参数,用于改变该工具的行为。void xhprof_enable ([ int $flags = 0 [, array $options ]] )flags 该参数用于为剖析结果添加额外的信息,该参数的值使用以下宏,如果需要提供多个值,使用|进行分隔。XHPROF_FLAGS_NO_BUILTINS 跳过所有的内置函数XHPROF_FLAGS_CPU 添加对CPU使用的分析XHPROF_FLAGS_MEMORY 添加对内存使用的分析options 数组形式提供可选参数,在此处提供ignored_functions选项需要忽略的函数比如下面的例子,同时对内存和CPU进行分析,并且忽略对call_user_func和call_user_func_array函数的分析。xhprof_enable( XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU, [ 'ignored_functions' => [ 'call_user_func', 'call_user_func_array' ] ] ); // 这里是PHP代码,比如业务逻辑实现等要被分析的代码部分 .... $xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果 print_r($xhprofData);注意,如果使用XHPROF_FLAGS_CPU选项对CPU占用也进行分析,在Linux环境下,会造成比较高的系统负载,因此不建议使用,而推荐只使用XHPROF_FLAGS_MEMORY,对内存的分析不会对系统造成太多负载。形象化的查看分析结果安装graphviz使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '这里提示找不到dot命令,所以需要先安装graphvizyum -y install graphviz将xhprof安装包中的xhprof_html_和xhproflib目录放到服务器的web目录下由于分析结果的查看工具是基于web的,因此,我们需要将xhprof安装包中的xhprof_html_和xhproflib目录放到服务器的web目录下,让xhprof_html目录中的内容对外可以访问。比如我的测试服务器环境是使用vagrant搭建的CentOS,这两个目录放到/opt/xhprof-2.3.9目录下:cp -r /opt/xhprof-2.3.9/xhprof_html/ /www/nginx/php/xhprof_html cp -r /opt/xhprof-2.3.9/xhprof_lib/ /www/nginx/php/xhprof_libweb服务器使用的是Nginx,因此,修改Nginx的配置文件nginx.conf中的配置如下:server { location / { root /www/nginx/php;#等于php; index index.php index.html index.htm; } location ~ \.php$ { root /www/nginx/php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #支持解析php文件 include fastcgi_params; } 使用修改我们的代码,是其能够将分析结果存放到xhprof.output_dir(上面在php.ini设置的xhprof.output_dir=/tmp)指定的目录中。在 PHP 页面顶部加上:xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_MEMORY);在页面底部加上:$xhprofData = xhprof_disable(); require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php'; require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php'; $xhprofRuns = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中 $runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');//第二个参数是定义文件名称 echo 'http://ip/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';变量$runId是本次请求生成分析结果的id,最后我们访问http://ip 页面输出了一个链接地址,使用该地址就可以看到本次请求的分析结果。注意到中间的View Full Callgraph链接,通过该链接我们可以看到图形化的分析结果。查看安装结果[root@xxx /]# php -i | grep xhprof xhprof xhprof support => enabled xhprof.collect_additional_info => 0 => 0 xhprof.output_dir => /tmp => /tmp xhprof.sampling_depth => 2147483647 => 2147483647 xhprof.sampling_interval => 100000 => 100000查看分析结果文件[root@xxx /]# tree /tmp /tmp └── systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP └── tmp ├── 655f4470f21de.xhprof_test.xhprof └── 655f48cb6e9bf.xhprof_test.xhprof [root@xxx /]# cat /tmp/systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP/tmp/655f4470f21de.xhprof_test.xhprof a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}得到的是serialize后的数据<?php $str = 'a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}'; $arr = unserialize($str); var_dump($arr); array(1) { ["main()"]=> array(4) { ["ct"]=> int(1) ["wt"]=> int(889) ["mu"]=> int(61200) ["pmu"]=> int(25216) } }
2023年11月21日
23 阅读
0 评论
0 点赞
2023-11-20
nginx+php+mysql
nginx下载安装https://nginx.org/download yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel #编译环境 cd /opt wget https://nginx.org/download/nginx-1.25.3.tar.gz tar zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3 mkdir -p /www/nginx ./configure --prefix=/www/nginx make && make install启动/www/nginx/sbin/nginx常用指令nginx -V 查看版本,以及配置文件地址nginx -v 查看版本nginx -c filename 指定配置文件nginx -h 帮助nginx -s reload|reopen|stop|quit // 重新加载配置|重启|停止|退出 nginx")重新加载配置|重启|停止|退出 nginxnginx -t //查看配置是否有语法错误nginx -c /usr/local/etc/nginx/nginx.conf //启动是加载指定nginx.conf文件建立软链接建立软链接目的是省去根目录快捷操作nginx[root@xxx opt]# ln -s /www/nginx/sbin/nginx /usr/sbin/ [root@xxx opt]# nginx -v nginx version: nginx/1.25.3 # 删除软连接 rm -rf /usr/sbin/nginx安装启动好php-fpm后,修改nginx.conf并重启nginx把 /scripts$fastcgi_script_name** 改成 **$document_root$fastcgi_script_namelocation ~ \.php$ { root /www/nginx/php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #支持解析php文件 include fastcgi_params; } 重启nginxnginx -t nginx -s reloadPS:如果还报错 [error] 37432#0: *85 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream 那一定是php文件路径不对phpyum方式安装用yum方式安装php最新版1 安装 epel-release源和 源管理工具yum-utilsyum -y install epel-release yum-utils2 安装Remi软件源Remi软件源官方地址: https://rpms.remirepo.net/CentOS7安装:yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpmCentOS7启动php模块并安装:yum启动php模块,根据需要选择自己格式的版本,如remi-php74模块,就是php7.4版本。:yum-config-manager --enable remi-php80 #启用remi源的php8.0模块注:如果显示没有这个命令,则需要先安装yum -y install yum-utils 插件。安装php及相关扩展:yum install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-json php-redis安装成功:php -v 查看版本为php8.0版本3 启动php-fpm[root@xx logs]# whereis php-fpm php-fpm: /usr/sbin/php-fpm /etc/php-fpm.d /etc/php-fpm.conf /usr/share/man/man8/php-fpm.8.gz [root@xx logs]# systemctl start php-fpm mysqlyum安装mysql MySQL三种安装方法(yum安装、编译安装、二进制安装)yum安装mysql1.卸载旧版mysql如果安装过先卸载,第一次安装略过此步[root@bunian etc]# rpm -qa | grep mysql mysql-community-common-5.7.38-1.el7.x86_64 mysql-community-client-5.7.38-1.el7.x86_64 mysql80-community-release-el7-6.noarch mysql-community-server-5.7.38-1.el7.x86_64 mysql-community-libs-5.7.38-1.el7.x86_64 # 所有组件都要删除 [root@bunian etc]# rpm -e --nodeps mysql-community-common-5.7.38-1.el7.x86_64 [root@bunian etc]# rpm -e --nodeps mysql-community-client-5.7.38-1.el7.x86_64 [root@bunian etc]# rpm -e --nodeps mysql80-community-release-el7-6.noarch [root@bunian etc]# rpm -e --nodeps mysql-community-server-5.7.38-1.el7.x86_64 [root@bunian etc]# rpm -e --nodeps mysql-community-libs-5.7.38-1.el7.x86_64 # 清理yum headers cache [root@bunian etc]# yum clean all2.安装2.1 rpm安装yum源[root@bunian tmp]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm2.2 下载rpm源文件再安装[root@bunian tmp]# wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm [root@bunian tmp]# yum localinstall mysql80-community-release-el7-6.noarch.rpm3.选择mysql版本[root@bunian tmp]# yum repolist all | grep mysql mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Comm 禁用 mysql-cluster-7.5-community-source MySQL Cluster 7.5 Comm 禁用 mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Comm 禁用 mysql-cluster-7.6-community-source MySQL Cluster 7.6 Comm 禁用 mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Comm 禁用 mysql-cluster-8.0-community-debuginfo/x86_64 MySQL Cluster 8.0 Comm 禁用 mysql-cluster-8.0-community-source MySQL Cluster 8.0 Comm 禁用 mysql-connectors-community/x86_64 MySQL Connectors Commu 启用: 192 mysql-connectors-community-debuginfo/x86_64 MySQL Connectors Commu 禁用 mysql-connectors-community-source MySQL Connectors Commu 禁用 mysql-tools-community/x86_64 MySQL Tools Community 启用: 90 mysql-tools-community-debuginfo/x86_64 MySQL Tools Community 禁用 mysql-tools-community-source MySQL Tools Community 禁用 mysql-tools-preview/x86_64 MySQL Tools Preview 禁用 mysql-tools-preview-source MySQL Tools Preview - 禁用 mysql57-community/x86_64 MySQL 5.7 Community Se 禁用 mysql57-community-source MySQL 5.7 Community Se 禁用 mysql80-community/x86_64 MySQL 8.0 Community Se 启用: 343 mysql80-community-debuginfo/x86_64 MySQL 8.0 Community Se 禁用 mysql80-community-source MySQL 8.0 Community Se 禁用默认是开启8.0版本4.去除公钥检索校验 (最重要的地方)这个地方容易出错,原因是没有去除校验导致服务安装后无法启动#gpgcheck改成0 [root@bunian tmp]# vim /etc/yum.repos.d/mysql-community.repo [mysql80-community] name=MySQL 8.0 Community Server baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql5.安装mysql[root@bunian tmp]# yum install mysql-community-server6.配置mysql[root@bunian tmp]# vim /etc/my.cnf [mysqld] # 不区分大小写 lower_case_table_names=1 # 端口号 port = 3306lower_case_table_names7.启动mysql[root@bunian tmp]# systemctl start mysqld8.修改mysql root密码及外网访问初始密码在这里/var/log/mysqld.log# 密码是:6;-#?gn*q;0H [root@bunian etc]# grep 'temporary password' /var/log/mysqld.log 2022-06-21T03:25:39.021858Z 1 [Note] A temporary password is generated for root@localhost: 6;-#?gn*q;0H登录mysql修改密码[root@bunian etc]# mysql -h localhost -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.35 Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpasswd'; mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed修改外网访问在 mysql 数据库的 user 表中查看当前 root 用户的相关信息select host, user, authentication_string, plugin from user;执行完上面的命令后会显示一个表格查看表格中 root 用户的 host,默认应该显示的 localhost,只支持本地访问,不允许远程访问。授权 root 用户的所有权限并设置远程访问update user set host='%' where user='root'; GRANT ALL ON *.* TO 'root'@'%'; GRANT ALL ON *.* TO 'root'@'%';执行两次 GRANT ALL ON . TO 'root'@'%';刷新权限mysql> flush privileges;9.检验是否安装成功# 查看mysql端口号 [root@bunian etc]# netstat -nltp | grep 3306 tcp6 0 0 :::33060 :::* LISTEN 1292/mysqld tcp6 0 0 :::3306 :::* LISTEN 1292/mysqld 10.Navicat连接用Navicat连接报错:2059 - Authentication plugin 'caching_sha2_password' cannot be loaded原因以及解决办法由于目前已有的客户端连接软件还不支持Mysql8新增加的加密方式: caching_sha2_password 所以我们需要修改用户的加密方式,将其改为老的加密验证方式: mysql_native_password#登录 mysql -h localhost -p #选择数据库 use mysql; # 注意:先 select host, user from user; 查看host值再决定以下是'root'@'%' 还是 'root'@'localhost' ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; #刷新权限 FLUSH PRIVILEGES; 11.php连接mysql连接Navicat创建test数据库、new表vim /www/nginx/php/index.php<?php $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 执行查询 $sql = "SELECT * FROM new"; $result = $conn->query($sql); // 输出数据 if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - name: " . $row["name"]. "<br>"; } } else { echo "0 结果"; } //访问ip/index.php id: 1 - name: 测试文章
2023年11月20日
37 阅读
0 评论
0 点赞
1
...
55
56
57
...
157