我仔细查看了Wordpress的内存消耗情况。在我的网站上,似乎为每个页面分配了20MB的RAM,只是为了为所有插件的运行准备一个舒适的环境。我这样策划:
没有一个地方需要优化,没有一个坏蛋会吃掉大部分内存。消耗量分布在许多php模块上。
我们如何让Wordpress在内存中只初始化一次环境,然后在每次点击时多次重用它?我不想让速度慢的PHP在每次用户点击时消耗20 MB的内存——即使在内存丰富的服务器上,完成所有这些工作也需要几秒钟的时间。您基本上需要可以重用的只读内存块。
而且为什么是20MB?有人能对此提供见解吗?
编辑:这是在我的开发机器上运行的Wordpress上的WinCacheGrind输出(比共享主机快得多)。正如您所看到的,仅仅生成主页的HTML就需要花费一秒钟的时间。通过共享主机来减缓这一速度,你就会遇到麻烦。我选择了占用大部分时间的方法。您将如何对此进行优化?
编辑:以下是来自的查询统计信息this fantastic functions.php profiling tool.
Load: 12 queries - 532ms - 19.1MB - 43 cache hits / 53
Query: 15 queries - 563ms - 19.0MB - 72 cache hits / 86
Display: 21 queries - 705ms - 19.2MB - 234 cache hits / 257
编辑:你想看一些肯定会吓到你的东西吗?在索引末尾插入这些行。php:
echo "<pre>\\n";
print_r(get_defined_vars());
echo "</pre>\\n";
我试图数一数当前帖子的正文存储在内存中的次数。我数了20个例子。然后我意识到PHP有引用计数,所以拷贝数量减少到只有三个:两个似乎在WP\\U查询中,一个在对象缓存中。我正在进一步调查。
这就是为什么我认为WordPress需要针对内存问题进行重构。您再也不能将其内存消耗归咎于其工作的复杂性。它只是做了一大堆错事。
编辑:经过一天的努力,我的发现如下:
1) 88%的内存来自require或include或include\\u once类型的调用:
2) php文件包含主要发生在服务请求的第一部分(毫不奇怪),这也是耗尽所有内存的地方:
3) 绘制发出请求期间正在执行的所有函数非常有趣。总共有12000多个电话。我抖动它们以使其更可见(水平轴基本上是堆栈的深度):
4) 我能想到的唯一前进的方法是尽量减少。包含php文件。如果我将函数按它们来自的文件进行拆分,您可以看到许多文件最多被命中一次或两次。我们需要一种方法,在不需要的时候跳过它们。例如,我的远程数据库备份插件被加载和注册,只是为了永远不用。以下是按文件名拆分的上述绘图:
我提供了一笔名副其实的奖金:)用于重构,这将导致我的博客内存占用减少30%或更多。
编辑:我安装了WP 3.1,这里是与旧版本的比较。
蓝色为WP 3.1,红色为3.0.4。新的WP速度更快,但占用更多内存。
以下是包含文件的列表。
这让我意识到“一应俱全的SEO包”消耗了多少内存——一种方法是只使用插件功能的一小部分来获得我想要的东西。而且,我自己的插件似乎很糟糕。
我想尝试条件加载,例如注释。php(我不允许在我的博客上发表评论)和其他几个网站。我删除了所有不推荐使用的代码。我修剪了KSE。php仅按需加载其全局表。我简化了l10n(不进行本地化),使其函数立即返回字符串,无需查找。我还远远没有达到我任意设定的30%的分数。
编辑:我下载并启用了带有默认设置(32MB操作码缓存)的APC。比较如下:
您可以看到,代码加载速度大大加快,代码占用的内存空间也更少(可能是因为我们只处理操作码,而不是原始源代码)。然而,内存消耗仍然相当高。