PHP7环境开启opcache和memached给wordpress提速

2019年4月28日12:04:28 5 10,642 6538字

现在还坚持写博客的人纯粹是一种情怀,因为目前博客的流量越来越少,依靠博客赚钱基本上是不可能的,甚至连服务器的费用都赚不回来,因此很多博客上干脆就不挂广告。博客没有一点收入,但是对于有情怀的人来说总想让自己的博客访问速度快一些,访问体验能够媲美门户网站,要达到这种效果就得从两方面着手,一个是升级服务器,另一个就是不断的折腾去优化服务器和程序。

wordpress

目前博客程序很多,而wordpress是大家公认为最臃肿的博客程序,但是依然有很多人选择它,就是因为它虽然臃肿,但是功能强大,更新及时,安全性高,模板和插件资源丰富。而我之所以选择wordpress则纯粹是因为已经习惯了,懒得再折腾。

wordpress之所以慢是因为它不能生成纯静态页面,而是每次访问都要生成页面,所以耗费资源较大,如果是新手的话用Hexo等纯静态程序或Zblog等轻量级程序可能速度会更快(只是可能,因为我也没用过这些程序,只是别人说比较快)。

PHP7环境开启opcache和memached给wordpress提速

服务器

其实说wordpress访问慢的主要原因还是服务器不够强大,如果服务器足够强大的话用那种博客程序的访问速度差异都会很小,但好的服务器需要不少银子,这就要看你的情怀有多浓了。但无论如何用一个VPS或云主机是起码得,以现在的价格几百元就能搞定,而虚拟机真没有多大折腾的空间。现在阿里云、百度云、腾讯云等在双十一等时间都会搞活动,价格会更便宜,所以入手一台云服务器也就是一顿饭钱的事。

主题

wordpress速度快慢跟主题有很大的关系,主题除了影响速度外还有和php版本的兼容性,和新版wordpress兼容性、安全性等也有很大关系,因此尽量选一个优质的收费主题,因为收费主题后期更新有保障。很多收费主题都集成了常用插件和常用功能,这样不仅能够减少插件安装,同时也能够节约很多时间,因为插件多了兼容性问题可能就会比较突出,而且插件的很多功能相互重复,安装多了系统要为重复功能浪费很多资源。

还有很多功能如果不用插件实现,而用纯代码试下的话就需要编辑PHP文件,而网上的很多教程针对的PHP版本不同,甚至有些教程是针对windows系统的,这样新人很容易出错。

LNMP环境

用wordpress要想快还是得选LNMP环境,用windows会有各种毛病,而且速度会比linux差很多。对于新人来说linux可能是个阴影,我到目前为止对于linux还是个新人,只会照着教程一步一步的进行,离了教程什么都干不好,不过好在目前有强大的WDCP和宝塔面板,还有万能的百度,所以只要肯折腾,一切都不是问题。

对于不懂linux又不愿意从头学的人,我强烈推荐使用面板,因为真的很简单,使用面板后一切就和windows差不多,全程可视化操作。就面板而言宝塔更为小巧,而且更新较快,和用户互动比较多,功能上调整较快,但在论坛看小毛病也比较多,对于新人可能要习惯折腾。

PHP7.2

LNMP环境中PHP最好选择PHP7.2版本,因为PHP7.2编译效率大概是PHP5.6的10倍以上,PHP5.6以下版本就更不用说了。编译效率高不仅是速度快这一个优点,同时也意味着可以支持更多的并发数。如果选用PHP7.2的话mysql我建议选5.6以上版本。但是很多老的wordpress主题和插件可能不支持php7.2,会出现乱码,白屏等各种问题,如果你使用的主题较老,且需要使用特定插件的话那么还是PHP5.6兼容性更好一些。

为什么选择PHP7.2,而不是其他,这是因为7.2版本目前比较稳定,主题支持也较好,7.3版本还不够稳定,而7.1版本相对7.2版本效率还不够高。

memached

memached是提速的利器,不仅是对wordpress,其他程序也一样,但前提是得是独立主机,虚拟主机就不用想了。关于怎么部署memached的教程网上有很多,但是要在linux下安装memached并不是一件容易学会的事情,即使照着教程也会各种出错,所以对于不懂linux的人还是用面板比较方便,一键安装。

PHP7环境开启opcache和memached给wordpress提速

宝塔面板安装memached

正常linux下安装memached比较麻烦,因为需要经过Mencached 的服务端安装、libmemcached安装、php-memcached拓展三步,每一步都可能出错,尤其是php-memcached可能因版本问题会一直不成功。PHP7.0以上版本需要下载github PHP7专用的memcached组件版本,地址https://github.com/php-memcached-dev/php-memcached/archive/php7.zip。

如果不想用面板安装,而要ssh编译安装的话那网上有大把的教程,照着安装就行,但需要注意服务器环境是否和你的一样,否则基本上不会成功。

memached服务器端安装好后百度教程配置wordpress插件,也很简单,网上教程一大把。

opcache

opcache是PHP自带的功能,不需要安装,只要开启就行。在php安装目录下的php.ini文件开启。

打开php.ini搜索opcache,发现[zend opcache],在他下面第一行加上

zend_extension= /www/wdlinux/nginx_php-7.2/lib/php/extensions/no-debug-non-zts-20090626/opcache.so

上面的路径根据自己的实际路径改下,其他内容参照下面的,下表没有的可以不用改。

#启用Zend Optimizer优化开关

opcache.enable=1

#共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB),推荐128M(根据服务器内存大小调整)

opcache.memory_consumption=128

#暂存池中字符串的占内存总量.(单位:MB), 推荐 8

opcache.interned_strings_buffer=8

#最大缓存的文件数目 200 到 100000 之间,推荐 4000

opcache.max_accelerated_files=4000

#;内存“浪费”达到此值对应的百分比,就会发起一个重启调度.

opcache.max_wasted_percentage=5

#2s检查一次文件更新 注意:0是一直检查不是关闭,推荐 120

opcache.revalidate_freq=2

#是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释,推荐 0

opcache.save_comments=0

#打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高

opcache.fast_shutdown=1

MYSQL缓存

数据库缓存可以很大程度上降低查询次数,从而节省CPU资源。这个功能看起来很高大上,但设置起来和opcache一样简单。

打开配置文件my.cnf进行下面两行设置:

query_cache_type = 1        //开启缓存功能,0关闭、1开启、2仅缓存带有 sql_cache 的 select 语句;

query_cache_size = 32M   //设置缓存空间大小,设置几十兆就行,太大增加服务器负担;

重启mysql

通过这两句设定就成功开启了mysql缓存,是不是比想象的简单很多。

配置完了需要在mysql命令行输入以下语句, 查看是否设置成功;

show variables like "%query_cache%"

输入命令后会返回以下结果,和自己设置的对比下看是不是相同,相同即表明设置成功,当然也可以刷新wordpress后再查询。

mysql> show variables like '%query_cache%';

+------------------------------+----------+

| Variable_name                | Value    |

+------------------------------+----------+

| have_query_cache             | YES      |

| query_cache_limit            | 1048576  |

| query_cache_min_res_unit     | 4096     |

| query_cache_size             | 10485760 |

| query_cache_type             | ON       |

| query_cache_wlock_invalidate | OFF      |

+------------------------------+----------+

6 rows in set (0.00 sec)

上面结果的意思如下:

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。

Qcache_free_memory:缓存中的空闲内存。

Qcache_hits:每次查询在缓存中命中时就增大

Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。

Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数

这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)

Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。

Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。

Qcache_total_blocks:缓存中块的数量。

关于mysql数据库缓存开启教程网上还有很多,可以很容易找到适合自己操作的教程。

PHP-Fpm

很多wordpress的502错误都和php-fpm及nginx.conf配置有关,调整这两个设置可以根治502问题,同时调整设置也可以提高服务器负载。

php-fpm初始/空闲/最大worker进程数,根据服务器内存来定,基本上每个进程占20-30m内存,自己按照内存大小计算合理数字。

pm.max_children = 300

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

最大处理请求数

最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的,这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。

pm.max_requests = 10240

最长执行时间

最大执行时间在php.ini和php-fpm.conf里都可以配置,配置项分别为max_execution_time和request_terminate_timeout,建议设置300秒。

nginx.conf

nginx.conf设置也会解决各种502问题,其实502问题也就是nginx的问题,出现这一问题基本上就是nginx超时。打开nginx.conf,找到FastCGI的timeout时间,并修改如下:

http {

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

......

}

重启nginx

以上所有设置完成后重启nginx服务,如果不会重启的话直接重启服务器即可,wordpress马上飞起。

插件

目前我只启用了w3 total cache插件,之所以放弃WP Super Cache是因为它的memached功能不正常,同时w3 total cache功能也更强大,不但能缓存页面,还能缓存数据库,压缩js和css,一个插件基本上干了所有的活。但这个插件设置起来比较麻烦,如果遇到因为缓存而出现的问题排查起来可能会比较费时间。

以前用这两个插件,现在已停用。WP Super Cache和Autoptimize两个插件,其中WP Super Cache开启了对象存储。

另外还安装了WP Clean Up,一款数据库优化插件,可以删除历史版本,碎片数据,优化数据库,从而太高速度,但这个插件不用常开,过一段时间优化一次即可。

至于有人说在开启memached和Opcache的情况下WP Super Cache没有多大用,但我自己对比后发现还是开启WP Super Cache后更快一些。当然这也许是心理作用,因为已经很快了,那点差异很难观察到。

CDN

其实如果带宽足够的话都用不着CDN,但在带宽太贵的的情况下CDN是不错的选择,对于图片、js、css等体积较大的资源加速非常明显。

以上所有设置中只有memached比较麻烦,其他都很容易,其实如果有老鸟带着设置一遍的话基本上就能上手,自己折腾的话只能让时间成为老师。

以上记录的核心是memached和opcache,这两个才是提速的关键,但很多人望难而退,其实动手做起来并不难。

这篇文章其实是我自己使用wordpress过程中的经验,是一种思路的整理,而不是教程,因为很多内容都没有详细的步骤,因为我自己不懂服务器运维技术,如果强抄别人的教程很可能会误导他人。


踩雷

因为不懂技术,所以对服务器和模板只能通过尝试才能知道结果,而不像大佬动脑子一想就明白。这样做的结果是参照各种教程,折腾了半天结果可能只起了副作用,于是就成了踩雷大人。踩雷本身并不可怕,可怕的是经常踩同一颗雷,原因是不同的代码可能是同一个功能,尝试一种代码失败后看见另一种代码又想尝试,于是再次翻车,更别提还有穿着马甲的插件。踩雷多了,时间长了可能忘了自己都踩过那些雷,所以索性记下来,下次再折腾时好有个准备。

1、百度CDN动态加速

前两天开了百度动态CDN,对php进行加速,明显感觉速度快了不少,但出现了副作用,粗略观察有。文章不计数、百度统计有遗漏、社会化登录间歇性白屏(估计是把用户特征码给缓存了,只是猜测)、首页链接新页面打开变成了当前页打开,对用户中心似乎也有影响。虽然所有的影响都不严重,尤其是这些影响对绝大多数从搜索引擎进来的人来说根本用不到,但喜欢折腾的人总想完美,这么多瑕疵当然只能忍痛舍弃。

后来发现百度CDN受了无妄之灾,其实是W3的SSL缓存引起的基数不准,原理不明白。

2、webp

网上看教程,说webp比jpg小一般,能加快速度,于是就上了个EWWW Image Optimizer插件,能够自动将上传的图片转化成webp,并根据浏览器自动选择支持的格式。看起来很高端,但实际用起来并没有提高页面打开速度,据推测可能是插件本身执行效率不够高,或者插件在缓存后面工作,导致缓存无效。另外我开了CDN,且大多数页面图片并不多,所以对于大多数页面来说这个插件时负优化的,于是卸载了插件。

卸了插件又看到了function代码支持webp,于是又折腾,结果完了才反应过来,没有判断和自动转化程序,如果只上传了webp,那么不支持的浏览器将无法显示图片,于是又删除。

3、Nginx的fastcgi cache缓存

看教程Nginx开启fastcgi cache或者proxy缓存效果能甩缓存插件好几条街,于是又心痒痒,但最终还是忍住了冲动,因为怕把服务器给折腾的起不来。因为有过惨痛教训,自己折腾的Nginx服务不能启动,导致网站瘫痪,最后找人给弄好,就写个博客真犯不上这么折腾。等下次换服务器时可以在新服务器上试下,不行的话直接重装。

现在还没有弄明白fastcgi cache为什么就要比缓存插件快呢?我感觉那些写所谓的秒杀缓存插件的教程的大佬博客也没有快到哪里去。

本站文章授权后方可转载,请勿侵权!
匿名

发表评论

匿名网友 填写信息

评论:5   其中:访客  3   博主  2
    • yancy_01 yancy_01 1

      WordPress 每次 用WP Statistics 查询访客记录,都会卡死,每次看宝塔的性能,CPU 和 负载都会飙到100%,显示连接数据库出错。用了 memcached,结果还是会有这个问题,后来想尝试优化数据库,看到了您的文章,尝试了下 Opcache,结果,挺好的,现在只有 CPU 会彪到 100%,负载正常了,CPU 也是只有一瞬间到100%,然后马上就正常了,开心,感谢。

        • 水拍石 水拍石

          @ yancy_01 我感觉你可以尝试下开启mysql缓存,WP Statistics 我也用过,感觉耗资源,用处还不大,我个人感觉还不如百度统计方便,当然你有特定需求的话就是另一回事。

            • yancy_01 yancy_01 1

              @ 水拍石 WP Statistics 可以直接在 主页的侧边栏显示访问信息,我比较喜欢。如果用 百度统计 或者 友盟统计,统计数据需要跳转页面去查询。不太喜欢。mysql 缓存开启了, memcached Opcache 都安装了,也加了mysql的内存到512M了,现在感觉挺好的。

              • yancy_01 yancy_01 1

                @ 水拍石 另外问下,您使用的 评论被回复的邮件通知 是插件 还是 代码?

                  • 水拍石 水拍石

                    @ yancy_01 现在是主题集成的,在集成前用的代码,代码很简洁,感觉用不着插件。