在更新WordPress从5到wp 6.1.1,wp_query(或query_posts)吃了荒谬的内存量,在非常简单的查询列出1000自定义帖子。我有16000在数据库中的这种类型的帖子。和很多自定义ACF字段,但在以前的WordPress版本没有问题。
我都试过了,
工作程序挂起缓存添加(真);-无影响
- *“字段”=〉“ID”**,-无效果
- “缓存结果”=〉假*,-无效果
总是以-致命错误结束:第2187行上的/class-wpdb. php中允许的内存大小536870912字节已耗尽(尝试分配 * 字节)
我只留下了具有
$quotesToGetProcessedArgs = [
'post_type' => 'QuoteRequest',
'post_status' => 'publish',
'offset' => '0',
'posts_per_page' => 1000,
'fields' => 'ids',
'cache_results' => false,
];
$quotesToGetProcessed = new WP_Query($quotesToGetProcessedArgs);
while ($quotesToGetProcessed->have_posts()) : $quotesToGetProcessed->the_post();
//do nothing
endwhile;
wp_reset_postdata();
正如您所看到的,即使我什么也不做,只要求ID,查询占用内存的荒谬数量(约1.5GB!!!!),我能够临时解决它通过添加ini_set('memory_limit','1500 M');,但这不是真实的的解决方案,在开发我有旧的WordPress一切工作,所以我怀疑一些wp 6的变化在后台做一些沉重的额外的东西。
1条答案
按热度按时间8dtrkrch1#
6.1.1在缓存中放入了比5.x更多的信息来提高性能。看起来你的
'posts_per_page' => 1000
查询将1000个帖子的 meta和术语数据放入该高速缓存中,从而耗尽了你的网络主机的RAM。请记住,使用数据库的目的是允许应用程序处理比RAM大得多的数据,但必须逐批处理,并且批处理必须适合RAM。
如何解决这个问题?最简单的选择是使用更少的帖子。
另一种可能是将这些行添加到查询中。您的查询禁止更新posts缓存。您还可以禁止更新元数据和术语缓存,使用这些query-arg行来控制缓存。
编辑如果这是你的代码,你最好的选择是将
posts_per_page
批处理大小减少到小于100。WordPress的核心开发人员正在为未来的版本添加更多的缓存,这将使大批处理大小作为一种编程技术变得更加不可行。或者你可以使用一个过滤器来禁止更新 meta缓存,但是要小心;如果你到处都这样做,你可能会放慢速度。
(我在函数名中使用了您的名字,因为这些函数污染了WordPress中的全局名称空间。)
This filter是从update_meta_cache()调用的,它使用了一个相当常见的WordPress模式,在这个模式中,从过滤器返回非空值会导致函数跳过(短路)一些可能代价高昂的工作。
可靠地使用这种筛选器需要查看源代码,甚至需要使用调试器单步调试代码,以确保获得所需的结果。
你还可以使用https://wpdirectory.net来查看它是如何被repo中的其他插件或主题使用的。