吉姆的一个客户的WordPress网站遇到了严重的性能问题,甚至比一只安静的蜗牛还要慢,比一群海龟通过糖蜜工厂时横冲直撞还要慢。更糟糕的是,该网站在浏览器里的实际渲染速度要比一些让人比较信服的基准测试的速度慢的多得多。甚至有大量加载的基准测试都会有一个更短的渲染时间。而客户的浏览器并没有大量的东西要加载。
在研究了多种方案后,吉姆决定将网站迁移到新的、更快的基础设施上。老旧的机器总是要更新换代的。新的设备会运行在运行更精准的Ubuntu操作系统上,而老的系统是Lucid。那么,作为奖励,客户获得了一次免费升级!就像免费的啤酒。
在新的设备上使用wget来安装缓存系统,吉姆遇到一个segfault错误。啊?从wget来的segfault错误?为什么一个真的真的很老,并且稳定的CLI设备在读取一个网站的时候会抛出一个段错误?要查找是什么问题,日志似乎是一个符合常规逻辑的正确的查找的地方。果然,发现了一个奇怪的日志条目。
GET /[redacted]/[redacted]/%E2%80%9Dhttp:/ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js%E2%80%9D HTTP/1.1 404
非常奇怪!因为,就吉姆目前所知,代码里应该没有这样的引用。因此,他开始查找源代码,但是并没有发现这样的对Google API的引用。接下来,他转储数据库并查找上下文。但是仍然找不到这个Google API的链接。但是他确实注意到在各种插件,主题和模板片段里有对7个不同版本的jQuery的引用。所以搜索改为专门查找特定的包含jQuery1.5版本的引用。
结果是这里只有一个引用,在头文件里。而且它看起来很正常。
<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js”></script>
作为调试技巧,盯着一行代码看可不是传统的教学里教过的。然而,在这种情形下,它是有效的。仔细观察我们会发现,script标签的src属性是被双引号引住。
并且,作为被“聪明的”引号引的结果是,所有的现代浏览器(幸运的是,包括wget),会尝试从以下 网址来获取代码:
http://[currentURL]/%E2%80%9Dhttp:/ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js%E2%80%9D.
现在看来,在大多数情况下,这真的是很恼人的。但是吉姆的客户的网站,使用了传统的重定向来解析遇到的链接。结果是,它并不是一个快的,简单地HTTP404结果被返回回来。他是一个完整的,完全没有被缓存的页面渲染,最终才导致404.因为请求绕过了代理层,页面以及对象的缓存,因此对每一个单独的请求都增加了800–4000ms的时长。是的,对每一个,单独的,请求。
也许你能够想到极大的提高整个网站的速度的解决方案。
当我们很多人去寻找我们最近正在努力解决的问题的解决方案之时,我们最首要的,最终的并且是唯一的资源通常的是互联网。当我们发现这个难以捉摸的例子,我们真正能够去做的却是,剪切、粘贴与盲目的放弃。重点在“盲目”上。是的,时代的集体智慧在网上是能获取到的,也很容易被我们掌握。但是们没有理解就去使用这些智慧是很危险的。即使是’理解’,也包含更多特定的涵义。