设为首页收藏本站

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 421|回复: 0

WordPress缓存和它如何提高你的网站速度

[复制链接]

307

主题

0

回帖

925

积分

高级会员

积分
925
发表于 2023-12-26 10:49:40 | 显示全部楼层 |阅读模式
WordPress缓存和如何提高你的网站速度 Vanush Ghamaryan 2021年4月8日页面速度15分钟阅读   

近一半的万维网是由WordPress提供的,但不知怎的,有一个常见的误解,认为WordPress网站是缓慢和滞后的。在这篇文章中,我们将为你提供关于一种能极大提高你的网站性能的技术——WordPress缓存的全部信息。

缓存是一种技术,它允许您将长时间运行的任务的结果存储在快速访问内存中,然后重用该结果,而无需实际执行任务。

这意味着缓存内容的显示速度比直接从服务器加载的内容快得多。这就像背诵乘法表一样。一旦你记住了它,马上背乘法题的答案比试着重新计算一遍要快得多。缓存可以在一个正在运行的web应用程序的不同阶段执行,因此每个阶段被称为一个缓存层。我们将在本文后面详细介绍和讨论每个阶段。现在,让我们看看默认的WordPress缓存是如何工作的。默认情况下,

对象缓存是启用的。几乎每个查询都被WordPress缓存,结果被重用。但缺点是它只适用于当前请求,因此请求之间不共享缓存,这对应用程序来说可能是一个非常糟糕的瓶颈。有很多方法可以改进这一点,所以让我们深入研究一下。正如我们前面所说的,有许多缓存技术可以加快和增加你的WordPress网站的吞吐量。让我们将它们划分为缓存层并进行更深入的研究。默认的是对象缓存层,所以让我们从它开始。然后我们将检查字节码缓存、页面缓存和CDN缓存。对象缓存

对象缓存是一种常用的技术,当您将数据库查询的结果存储在更快的数据提供程序中,然后重用该数据时。默认情况下WordPress是启用的,但不会通过不同的请求共享。这意味着如果WordPress为请求#1缓存了一些数据,那么这些缓存的数据只会在请求#1期间使用。对于请求#2,WordPress将再次查询数据库。这也提高了性能,但如果我们使用像Redis、Memcached或APCu这样的持久缓存存储,就不会有那么大的效果。Redis

Redis是一个开源的、内存中的数据结构存储。在WordPress中,你可以选择使用Redis以持久的方式存储由WordPress的原生对象缓存生成的值,允许缓存的对象在页面加载之间重用。要安装它,你应该按照Redis数据库的安装说明,然后在WordPress中安装以下插件之一:WP Redis或Redis对象缓存,并配置Redis连接。Memcached是一个分布式内存对象缓存系统,最初是为了通过减轻数据库负载来加速动态web应用程序。基本上,它就像你的应用程序的短期记忆。要使用它进行WordPress对象缓存,你应该按照说明安装Memcached服务器,然后安装PHP Memcached扩展,最后安装W3总缓存(或Memcached是你的朋友)插件,并在对象缓存设置中选择Memcached作为缓存方法。APCu

APCu是APC扩展的继承。在APC中,你同时拥有操作码缓存(又名opcache,我们将在后面讨论它)和对象缓存。那么究竟是什么导致了它的灭绝呢?PHP 5.5及更高版本自带opcache,导致APC不兼容,opcache功能毫无用处。这就是APCu的作用所在,它只提供对象缓存功能(过时的opcache被删除了)。要使用APCu,你需要先安装APCu PHP扩展,然后安装WordPress的W3总缓存插件,并配置它使用APCu。字节码缓存概述

最好的解决方案之一,可以使你的WordPress网站或所有用PHP编写的应用程序的速度提高约3倍。简单地说,我们编写的PHP代码编译成字节码,在PHP引擎中执行。编译是一个缓慢的过程,但是我们可以保存编译后的字节码,并为每个请求重用它。这是这个过程的示意图。这个缓存层的缺点是,如果更改了PHP脚本,就必须清除字节码缓存。但这是一个出色的解决方案,因为我们在生产中不经常更改代码,不是吗?此外,还有计时器,它将检查文件的更改,然后清除缓存。要在Ubuntu上启用它,你首先应该通过运行 sudo apt-get install php7.4-opcache

安装OPcache扩展,你可以更改PHP版本为你正在使用的版本。安装后,你应该编辑你的php.ini文件 sudo vim /etc/php/7.4/fp /php.ini

并添加这个块: opcache.enable=1opcache.validate_timestamps = 1opcache.revalidate_freq = 60opcache.max_accelerated_files = 20000opcache.memory_consumption = 128opcache.interned_strings_buffer = 32opcache。然后保存文件并重新启动FPM。Zend OPcache扩展现在应该被配置并缓存你的网站托管的PHP脚本。我们可以通过运行自定义PHP脚本来检查它是否启用。我们稍后再做,但首先,让我们看看指令是什么意思。

opcache”。通过将该指令设置为1,您可以启用Zend OPcache。通过将其设置为0,您将禁用缓存。

opcache”。将此指令设置为1将使PHP检查每个文件的时间戳,以查看它是否已被修改,如果是,它将更新该文件的缓存。当设置为0时,它不会更新每个文件的缓存,每次修改文件时都需要重新启动PHP。

opcache”。revalidate_freq=60

到目前为止,您可能想知道系统应该多长时间(以秒为单位)检查一次文件时间戳,以查看对共享内存存储分配的更改。(1表示每秒检查一次。“0”将导致OPcache对每个请求进行更新检查。)opcache”。当涉及到可以存储在缓存中的脚本的最大数量时,允许的数量从200到1000000。通常,它应该高于宿主目录中脚本的数量。

opcache”。将这个指令设置为缓存应该使用的最大MB内存量。稍后您将能够通过使用静态脚本看到使用了多少。但是对于一个有最少模块的WordPress安装来说,128 MB应该足够高了。PHP使用一种称为字符串存储的技术,通过在单个变量的代码中存储重复的字符串来减少内存并提高性能。将这个指令设置为32 MB,然后检查统计数据,看看需要增加多少。

opcache”。fast_shutdown=1

如果启用,加速代码将使用快速关闭序列。根据所使用的内存管理器的不同,这可能会导致一些不兼容。如果遇到问题,请将其设置为0。这是必需的最小配置,但还有许多其他变量,你可以在官方OPCache文档中找到它们。我们可以通过创建一个PHP文件并使用opcache_get_status()函数来测试OPcache是否已启用。这个函数向您显示许多有用的信息,比如哪些脚本被缓存了,使用了多少内存等等。为了节省时间,有一个叫做amnuts/opcache-gui的开源项目,它可以在一个格式很好的页面上显示所有的统计信息。代码包含在一个index.php文件中。要开始,运行以下命令将文件下载到www根目录。假设你的web文档根目录位于/var/www,文件将以opcache.php的名称下载到那里。使用web浏览器浏览到该文件,您应该会看到以下输出。这是我的开发笔记本电脑,所以OPcache没有配置为积极缓存。但是你可以看到它使用了7%的内存。您可以在第二个选项卡中看到缓存的文件,重置缓存并启用生命周期更新。使用这个仪表板,您可以调优上述设置,以实现最大的性能和最小的内存消耗。到目前为止,我们一直在探索不同的缓存技术,这将略微提高您的网站的性能。但最快的网站是静态网站。使用页面缓存层,我们可以将动态的WordPress网页转换为静态网站,Nginx将以光速提供服务。基本上,这个想法是从PHP-FPM缓存最近生成的网页响应作为一个带有特定缓存键的静态文件,比如URL,并从缓存目录到您的网站的所有访问者。这种方法的缺点是它并不适用于所有的网站。例如,如果您有一个非常动态的、不一致的网站(例如一个电子商店),或者相同URL下的页面具有不同的数据(example.com/account页面对于每个登录的用户都是不同的)。但是不要犹豫,您可以为该页配置排除缓存,同时仍然使用page cache层。两个比较流行的页面缓存实现是Nginx FastCGI缓存和Varnish缓存。从名称可以猜到,第一个服务器只能使用Nginx,因为第二个服务器是单独配置的,作为代理服务器使用。所以你可以使用它与每一个前端web服务器。我将展示Nginx FastCGI缓存的基本配置,就像我们在10Web上做的那样。需要90+的PageSpeed分数?使用10Web,您可以自动获得它!需要一个90+的网页速度分数?使用10Web,您可以自动获得它!首先,你需要在/etc/nginx/nginx.conf中添加FastCGI缓存配置。所以要编辑文件,输入:

sudo nano /etc/nginx/nginx.conf

,然后在http{}块中,添加以下行: fastcgi_cache_path /var/lib/nginx-tmp/cache levels=1:2 keys_zone=LIVE_SITE:100m inactive=60m max_size=64m;fastcgi_cache_key方案request_method美元主机request_uri美元; fastcgi_cache_lock;fastcgi_cache_revalidate;Fastcgi_cache_use_stale错误超时fastcgi_ignore_headers缓存控制过期fastcgi_pass_header set - cookie;fastcgi_pass_header饼干;第一个参数指定了缓存在文件系统中的位置(/var/lib/nginx-tmp/cache)。参数在/var/lib/nginx-tmp/cache下建立了一个两级的目录层次结构。在一个目录中存放大量文件会降低文件访问速度,因此我建议对于大多数部署使用两级目录。如果不包含levels参数,Nginx将所有文件放在同一个目录中。第一个目录在其名称中使用一个字符。子目录使用两个字符。第三个参数指定共享内存区域(LIVE_SITE)的名称及其大小(100m)。此内存区域用于存储缓存键和元数据,如使用时间。在内存中有一个键的副本可以使Nginx快速确定一个请求是HIT还是MISS,而不需要到磁盘上,这大大加快了检查的速度。1MB的区域可以存储大约8000个键的数据,100MB的区域可以存储大约800,000个键的数据。Max_size设置缓存大小的上限(在本例中为64m)。如果不指定,缓存可以使用所有剩余的磁盘空间。一旦缓存达到最大大小,Nginx缓存管理器将从缓存中删除最近最少使用的文件。在非活动时间段(60分钟)内未被访问的数据将由缓存管理器从缓存中清除,而不管它是否过期。缺省值为10分钟。也可以使用12h(12小时)和7d(7天)这样的值。第二个指令fastcgi_cache_key定义了缓存查找的键。Nginx将对缓存键应用MD5sum哈希函数,并使用哈希结果作为缓存文件的名称。使用fastcgi_cache_lock,如果多个客户端请求当前不在缓存中的文件,只有第一个请求被允许通过上游的PHP-FPM服务器。其余的请求等待该请求得到满足,然后从缓存中提取该文件。如果不启用fastcgi_cache_lock,所有请求都会直接发送到上游的PHP-FPM服务器。



fastcgi_cache_revalidate允许使用带有“ If-Modified-Since “和“ If-None-Match “报头字段的条件请求对过期的缓存项进行重新验证。在fastcgi_cache_use_stale指令中,当Nginx无法从上游的PHP-FPM服务器获取更新内容时,我们配置它从缓存中传递过时的内容。例如MySQL/MariaDB数据库服务器宕机。Nginx不把错误传递给客户端,而是从缓存中传递文件的过期版本。我们使用fastcgi_ignore_headers来配置Nginx忽略来自FastCGI服务器的Cache-Control Expires Set-Cookie头。我们允许使用fastcgi_pass_header指令从FastCGI服务器传递头文件。在HTTP上下文中输入这些指令后,保存并关闭文件。现在我们将配置缓存排除指令,并设置我们的虚拟主机使用前面配置的缓存。打开你的WordPress vhost配置文件 sudo nano /etc/nginx/sites-enabled/wp.conf

并把它添加到服务器{}块中,在那里每个字符串都被注释。设置$skip_cache 0;设置$ no_cache 0;#使用$no_cache在未来使用sed容易启用和禁用缓存 # POST请求和带有查询字符串的url应该总是跳过缓存if ($request_method = POST) {设置$ no_cache 1;} If ($query_string != ““) {设置$ no_cache 1;} #不要缓存包含以下片段的url如果($ request_uri ~ *”/ wp-admin / | / xmlrpc.php | wp -。*。php | / feed / | index . php |站点地图(_index) ? . xml”){设置$ no_cache 1;} 如果($ request_uri ~ *”/商店。* * | | /车。/我的帐户。* | /付款。* | /插件。*”){设置$ no_cache 1;} #不要使用缓存的登录用户或最近的评论If ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in“) {设置$ no_cache 1;} #不要使用woocommerce cookie缓存If ($cookie_woocommerce_items_in_cart = “1“){设置$ no_cache 1;} #包含自定义fastcgi配置,特别是不缓存的自定义页面包括/etc/nginx/fastcgi_conf.d / * . conf;

  if ($no_cache = 1) {设置skip_cache no_cache美元;最后添加到location ~ \.php$ {}:

fastcgi_cache_bypass $skip_cache;fastcgi_no_cache skip_cache美元;fastcgi_cache LIVE_SITE;fastcgi_cache_valid 60米;add_header X-Cache upstream_cache_status美元;这里我们使用前面定义的$skip_cache参数来轻松地使用缓存进行配置。同样在fastcgi_cache指令中,我们指向这个vhost使用之前定义的LIVE_SITE共享内存区域,并配置Nginx在HTTP响应中添加X-FastCGI-Cache头。这就是如何验证请求是否已经从FastCGI缓存中获得服务的方法。它可以接受的值是MISS、BYPASS或HIT。MISS表示为该页启用了FastCGI缓存,并且使用FastCGI后端处理提供服务;HIT表示从FastCGI缓存提供服务;BYPASS表示从FastCGI缓存处理跳过页面,并使用后端提供服务。现在你保存文件并退出,通过

sudo nginx -t

验证你的配置如果一切正常,你可以通过 sudo service重新加载nginx nginx reload

或 sudo systemctl reload nginx

还有很多其他的配置选项,你可以在官方文档中查看。对于测试,我们只使用curl命令并寻找X-Cache头文件。运行curl -I https://known-hamster.10web.me/

在第一次运行时,你应该会看到X-Cache: MISS,这是因为缓存是在这个请求期间填充的,并且是通过PHP-FPM提供的。   



在第二次请求中,它应该从Nginx FastCGI缓存中提供,X-Cache头值应该是HIT,如下图所示。   



和请求/wp-admin/页面将导致BYPASS,因为我们配置它不使用页面缓存。   



现在我们将我们的动态应用程序转换为服务静态HTML文件,但是我们可以通过使用CDN来服务它们来获得最终的速度。什么是CDN?

内容传递网络(CDN)允许您的内容通过分布在不同地点的服务器快速传播。CDN允许快速传输加载Internet内容所需的资产,包括HTML页面、javascript文件、样式表、图像和视频。如今,大量的网络流量(包括Facebook、Netflix和其他主要网站的流量)通过cdn传输。简单地说,cdn的目的是加快数据传输和改善连通性。为了做到这一点,CDN在不同网络之间的交换点上定位服务器。这些所谓的Internet交换点(IXPs)是不同Internet提供商的连接点,允许它们彼此访问来自不同网络的流量。通过与这些高性能和相互交织的位置连接,CDN提供商有能力减少数据传输的成本和旅行时间。

CDN缓存

CDN,或内容传递网络,将内容(如图像、视频或网页)缓存到代理服务器中,这些代理服务器比原始服务器更靠近终端用户。(代理接收来自用户的请求并将其传输到其他服务器。)服务器与发出请求的用户之间的距离是CDN能够更快地传递内容的原因。所以,如果我们启用CDN缓存,如果客户端设备请求内容,它将从附近的服务器提供服务。这被称为缓存命中。相反,如果CDN没有要服务的资源副本,并将请求重定向到原始服务器,就会发生缓存丢失。你可以通过设置s-maxage头来配置数据在CDN服务器中的缓存时间,s-maxage头为数据设置TTL。然后CDN将不会从原始服务器刷新它的数据,直到TTL到期。当TTL到期时,缓存将删除内容,因此对它的下一个请求将发送到原始服务器。如果内容有一段时间没有被请求,或者如果CDN用户手动删除特定内容,一些CDN甚至会先发制人地从缓存中删除文件。只有两个困难的事情n计算机科学:缓存失效和命名。

这是著名的Netscape(嗨,老伙计们!)开发人员Phil Karlton所引用的我最喜欢的一句话,因为它确实描述了使用激进缓存策略最痛苦的一面。很难判断何时应该刷新缓存,因为刷新次数过多将导致性能损失,而很少刷新将导致提供过时的数据。在10Web上,我们在主题更新、发布或页面编辑、插件激活和去激活时刷新缓存。应该从代码层到CDN层进行刷新缓存。首先,您需要刷新OPcache,然后是对象缓存,然后是页面缓存,最后是CDN缓存。这是一个很长的关于WordPress缓存层的指南。我试图解释和展示配置不同缓存层的每个步骤。在不久的将来,我们将有一篇关于每个缓存层的基准测试的文章。请继续关注,让我们知道你的想法!你喜欢这篇文章吗?传播这个词!留言取消回复

您的电子邮件地址将不会被公布。必填字段标记为*

您的电子邮件地址将永远不会被发布或共享。必填字段标记为*

COMMENT*

NAME *

EMAIL ADDRESS *

WEBSITE

在此浏览器中保存我的姓名、电子邮件和网站,以便下次评论时使用。





1评论排序最近的大多数回复   AMELIA LYNCH 2021年4月23日

哇-令人印象深刻的文章没有读所有的只是浏览它-但这肯定是关于加速WordPress的最好的文章。做得很好!恭喜你! 哇——令人印象深刻的文章没有读所有的东西,只是浏览了一下——但这肯定是关于加速WordPress的最好的文章。做得很好!恭喜你!保存取消删除回复相关帖子10个最快的WordPress主题比较(测试结果)我们如何达到90+的页面速度分数什么是内容传递网络?你需要知道最快的WordPress主机是什么[5个主机比较]#缓存#性能#网站速度# WordPress
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|跨境圈导航 ( 粤ICP备19025394号 )

GMT+8, 2024-11-25 00:17 , Processed in 0.055518 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表