我仔细查看了Wordpress的内存消耗。在我的网站上,似乎为每个页面命中分配了20MB的RAM,只是为了为所有插件的运行准备一个舒适的环境。因此,我对它进行了绘制:
没有一个地方可以优化,没有一个坏家伙会消耗大部分的内存。消费分布在许多许多php模块中。
我们如何才能使Wordpress仅在内存中初始化其环境一次,然后为每次命中多次重复使用它?我不想让缓慢的PHP在每次用户单击时都占用20 MB的空间-即使在具有大量内存的服务器上,也要花费数秒钟才能完成所有工作。基本上,您将需要可重用的只读内存块。
还有...为什么20MB?谁能提供对此的见解?
编辑:这是在我的开发计算机上运行的Wordpress上的WinCacheGrind输出(比共享主机快得多)。如您所见,仅花费一秒钟的时间就可以生成主页的HTML。通过共享主机降低速度,您会遇到麻烦。我选择了大部分时间使用的方法。您将如何进行优化?
编辑:这是此出色的functions.php分析工具的查询统计信息。
负载:12个查询-532ms-19.1MB-43次缓存命中/ 53 查询:15个查询-563ms-19.0MB-72个高速缓存命中次数/ 86 显示:21个查询-705毫秒-19.2MB-234个高速缓存匹配数/ 257
编辑:您是否想看到某些保证会吓到您的东西?将这些行插入index.php的末尾:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
我试图计算当前帖子的正文存储在内存中的次数。我计算了20个实例。然后我意识到PHP具有引用计数,因此副本的数量减少到只有三个:两个似乎在WP_Query中,一个在对象缓存中。我正在进一步调查。
这就是为什么我认为WordPress需要针对内存问题进行重构的原因。您再也不能将其内存消耗归咎于其功能的复杂性。它只是做错了很多事情。
编辑:经过一天的努力,这是我的发现:
1)88%的内存来自require或include或include_once调用类型:
2)php文件包含的内容大部分发生在服务请求的第一部分(并不奇怪),这也是消耗所有内存的地方:
3)绘制请求期间正在执行的所有功能非常有趣。共有12000多个电话。我将它们抖动以使其更加可见(“ Level”轴基本上是堆栈的深度):
4)我能想到的唯一方法是最大程度地减少包含的.php文件的数量。如果我将每个文件的功能分开,则可以看到许多文件最多被命中一次或两次。我们需要一种在不需要它们时如何跳过它们的方法。例如,我的远程数据库备份插件已加载并注册,根本就从未使用过。这是上面的图,按文件名分割:
我提供的赏金值得我所有声誉:)的重构,这将使我的博客内存占用减少30%或更多。
编辑:我安装了WP 3.1,这是与旧版本的比较。
蓝色是WP 3.1,红色是3.0.4。新的WP更快,但也占用更多内存。
这是包含文件的列表。
这让我意识到“ All In One SEO包”消耗了多少内存-一种途径是仅使用插件功能的一小部分来获取我想要的东西。另外,我自己的插件似乎还不错。
我想尝试对有条件加载,例如comment.php(我不允许在博客上发表评论)和其他几个条件。我删除了所有不推荐使用的代码。我整理了kses.php以仅按需加载其全局表。我简化了l10n(我不进行本地化),使它的函数立即返回字符串,而无需查找。我距离我随意设置的30%的目标还差得很远。
编辑:我下载并启用了APC的默认设置(操作码缓存为32MB)。比较如下:
您会看到代码加载速度大大加快,并且代码占用的内存也更少(可能是因为我们只处理操作码,而不是原始源代码)。但是,内存消耗仍然很高。