如何释放UPDATE_POST_META使用的内存?

时间:2019-06-11 作者:Pikamander2

我注意到update_post_meta 导致我的内存使用量略有增加。

通常情况下,增长幅度小到无关紧要。但我正在编写一个CSV导入函数,调用它10000多次,最终导致内存不足错误。

下面是一个简单的代码示例:

function update_business($myData)
{
    error_log("Used memory 1: " . memory_get_usage(false));
    error_log("Allocated memory 1: " . memory_get_usage(true));
    update_post_meta(\'13663\', \'business_id\', $myData);
    error_log("Used memory 2: " . memory_get_usage(false));
    error_log("Allocated memory 2: " . memory_get_usage(true));
}
这将导致:

...

Used memory 1: 17995848
Used memory 2: 17996992

Used memory 1: 17996992
Used memory 2: 18027720

Used memory 1: 18027720
Used memory 2: 18058448

Used memory 1: 18058448
Used memory 2: 18089176

Used memory 1: 18089176
Used memory 2: 18119904

...
没有update_post_meta 语句,则整个循环中的内存使用量保持不变(如预期的那样)。

但在update_post_meta 语句中,内存使用量越来越大,永远不会释放。

我尝试了一系列不同的清除内存的技术,包括:

wpdb::flush

  • 取消设置
  • gc\\u collect\\u cycles
  • wp\\u cache\\u flush
  • wp\\u suspend\\u cache\\u addition(true)
      但似乎什么都不起作用。

      我查看了大量的搜索结果,虽然有不少人遇到过这个问题,但除了“提高你的记忆限制”或“以不同的方式进行”之外,没有多少答案,这两种方法似乎都不是最好的解决方案。

      肯定有办法释放记忆?我假设WordPress、PHP、MySQL或其他东西正在缓存我不想缓存的东西,或者某个地方出现了内存泄漏,但我无法找到答案。

    2 个回复
    最合适的回答,由SO网友:Pikamander2 整理而成

    原来这是由于Query Monitor,一个记录每个查询信息的插件。每次运行update\\u post\\u meta时,查询监视器都会存储一些有关查询的数据,这些数据加起来最终超出了服务器的处理能力。

    在没有启用其他插件的情况下,在诸如二十一这样的默认主题上运行我的示例代码会导致预期的行为:

    ...
    
    Used memory 1: 5480528
    Used memory 2: 5480528
    
    Used memory 1: 5480528
    Used memory 2: 5480528
    
    ...
    
    因此,如果您遇到类似的问题,请尝试禁用所有插件并切换到默认主题,以帮助缩小问题范围。

    update_post_meta 这似乎不是问题,至少本身不是。

    SO网友:Mark Kaplun

    虽然您在设置中发现了特定的问题是好的,但一般的答案是您做错了。

    每次您执行任何需要大量DB操作的操作时,您都面临着内存不足、DB服务器带宽不足或时间不足的风险。这可能会变得非常棘手,因为可能在一台服务器上工作的某些东西将在另一台服务器上失败。

    执行任何需要处理Ks记录的操作的正确方法是,将其拆分为一次仅处理(例如)100条记录,并使用基于AJAX的流程控制操作进度,直到处理完所有数据。

    当然,随着时间的推移,PHP和MySQL的速度越来越快,硬件也越来越强大,这就是为什么您可以在代码中使用天真的“暴力”方法,但您正在走在边缘,尤其是如果您的代码不仅仅是“一次性的”,需要再次使用的话。

    相关推荐

    更新MySQL查询以使其再次运行

    我继承了一个我的客户不想重建的旧WordPress站点。函数中有一个旧的MySQL查询。主题的php,应该将类别图像与类别放在一起。当然,随着时间的推移,WordPress已经更新,查询也不再有效。我希望有人能帮我建议如何更新这个。代码为:function catImg($catId){ $data = mysql_fetch_object(mysql_query(\'SELECT * FROM `wp_ig_caticons` WHERE `cat_id` = \"\'. $catId