扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
WordPress作为一款知名的CMS管理系统,在全球范围内广泛部署,据说全球超过四分之一的网站基于WordPress创建,比如美国白宫官网也是基于WordPress创建的。WordPress具备很多优点,比如使用简单、资源丰富;但作为一款标准的CMS系统,由于需要考虑很多场景需求,因此从性能上来讲,原版的WordPress性能上并没有优势。
近期,某客户网站是多年前基于WordPress创建的官网,之前是运在linux服务器上,最近他们单位自己机房使用的是windows服务器。结果迁移上去后,明显变得卡不少,原来基本上是秒开,现在还要进度条转一两秒。
一般来讲,只要水平不是太差的开发人员,自研的程序在性能上是优于这些现成的CMS系统的,因此除官网外我们微构网络基本采用自研开发的网站程序(现在官网项目也基本采用自研程序)。在通常WordPress卡主要原因是有如下几个原因:
1、前端引用了google等境外服务器的资源,比如谷歌字体文件。
这个因素基本在国内采用WordPress的网站都不存在了,因为如果存在网站将卡得没法用,因为这些资源被防火墙拦截了,是无法访问的。因此大家,都是在创建项目后基本上就屏蔽或者用国内的镜像资源替代这些资源了。
2、数据库操作造成的卡顿。
虽然WordPress的数据库操作,性能确实不高,但WordPress的定位就是博客程序,所以从这个程序设计上就不是定位高性能,随便一个页面就是几十次查询操作。但即便是这样,在并发不高的网站,基本上不会因为这个原因造成的卡。
接下来就开始排查流程了,首先要排除上述两个常见因素。被拦截的前端资源这个因素不存在,因为在linux服务器上是没问题的;数据库操作问题理论上也不是,因为这种官网访问量并不高,而且在原来服务器上也没问题。
然后删除所有代码,进行程序空载测试。也就是所有的自定义代码全部删除,仅仅只加载WordPress核心程序。结果发现竟然还是要1秒以上。
当然WordPress空载的时候,核心程序也会进行数据库操作,监测的sql语句如下3条:
在加上通过调试wp-blog-header.php这个核心入库文件发现,即便禁止程序进行后续输出操作,页面执行时间也超过一秒。也就是只要执行wp-blog-header.php中的
require_once( dirname(__FILE__) . '/wp-load.php' );
就要一秒以上,这显然非常不正常。继续追踪溯源调试,最后发现是这样的链路:
//文件:/wp-load.php require_once( ABSPATH . 'wp-config.php' ); //文件:/wp-config.php require_once(ABSPATH . 'wp-settings.php'); //文件:/wp-settings.php require_wp_db(); //文件:/wp-includes/load.php $wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); //文件:/wp-includes/db.php mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
也就是最终造成卡的就是mysqli_real_connect这个方法了,而这个方法是php自带的一个方法,作用是建立数据库链接。从中可以看出还是程序与数据库之间存在问题,为了验证这个问题。我们编写了一小段不基于任何框架或程序的测试代码,代码如下:
<?php $t1=microtime(true); $h=mysqli_init(); $r=mysqli_real_connect( $h, 'localhost', 'root', 'password', null, '3306' ); var_dump($r); $t2=microtime(true); var_dump($t2-$t1);
这段代码的意义就是在于建立一个数据库链接,然后查看建立这个链接所需要花的时间,测试结果如下:
也就是仅仅建立一个数据库链接所需要的时间就是1秒多,因此造成前面所说的卡的主要原因就是在进行建立数据库链接时所花费的时间。通过查找相关资料得知,造成这个原因一个常见问题就是由于在配置数据库链接的时候,host填写的是localhost而不是127.0.0.1,只需要修改为127.0.0.1即可。
使用127.0.0.1时所话的时间都是个位数毫秒级,这个时间几乎可以忽略不计。当然很多标准的程序默认数据库配置信息就是填写localhost,而为什么某些情况就不行呢。可以参考我们发布的下一篇文章。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流