php - WordPress 更新后优化

标签 php mysql wordpress

背景

我有一个每 24 小时运行一次的 cron 作业,它会遍历特定帖子类型的每个帖子,并使用从 api 收集的新数据更新帖子。此时它正在工作。但这只是因为只有大约 1500 个帖子。但我知道这将增加到大约 40000-80000 个帖子。

目前运行更新大约需要 20 分钟(主要是因为 api 的请求限制为 30 次调用/分钟)。所以我无能为力。我在数据库中收到的帖子越多,花费的时间就越长。

我还使用 ACF pro 将字段添加到帖子类型。

但我担心的是数据库会出错,因为 sql 调用太多而且太多。

今天的样子

当前的设置是这样的:

  • 服务器 1:网络服务器
  • 服务器2:Mysql服务器

目前的更新代码如下所示,我觉得这一定是更好的方法。

public function updatePosts($apiPosts){

  /** Loop thru every post from the api, these are setup in another function */
  foreach($apiPosts as $post){
  /** Look to see if a post exist with the code */
     $args = [
       'post_type' => 'my_custom_post_type',
       'meta_key'  => 'code',
       'meta_value' => $post->code,
       'posts_per_page' => 1
     ];
     $post = get_posts($args);

     /** If no post was found, create a new post */
     if(!$post[0]){
       $newPost = [
          'post_title' => $post->title,
          'post_type'  => 'my_custom_post_type',
          'post_status' => 'publish'
       ]
       $post_id = wp_insert_post($newPost);
     }else{
       $post_id = $post[0]->ID
     }

     /** Update the acf fields on the post */
     update_field('field1', $post->field1, $post_id);
     update_field('field2', $post->field2, $post_id);
     update_field('field3', $post->field3, $post_id);
     update_field('field4', $post->field4, $post_id);
     update_field('field5', $post->field5, $post_id);
     update_field('field6', $post->field6, $post_id);
     update_field('field7', $post->field7, $post_id);
  }
}

我愿意接受您的所有建议。我有一种感觉,需要优化这一点。因为在这个循环中,正如我之前提到的,很容易循环 40000 个帖子。

最佳答案

我会将这些数据分成更小的部分,例如:

  1. 单独存储 api 数据(选项表中的某处)
  2. 设置更新操作以更频繁地运行,WP 支持每 10 分钟使用一次最大限制,但即使超时一分钟,它也会起作用(但是您需要调整 cron_scheldules)
  3. 将 get_posts 替换为对数据库的查询,该查询在 postmeta 表中查找,并且仅在找到时返回帖子 ID。
  4. 针对特定数量的帖子运行它。一旦执行了帖子检查(从 api),就会从 api 队列中删除帖子。
  5. 更新完成后(假设更新了 50 个帖子),请更新 API 队列。
  6. 我认为,更新不会总是更新帖子(比如信息没有改变),在运行更新之前找到一种方法来检查这一点,您可以从队列中删除所有不会更新的帖子(这样可以减少工作量)您的更新操作)。

更新

  • 您还可以在一个字段中填充自定义字段信息并存储该数组(稍后您将对其进行反序列化并在前端使用)。仅此操作就会将 SQL 查询(和缓存删除)数量减少 7 个查询。

    update_post_meta($ID, '_global_meta', $array_of_updated_data);

  • 关于php - WordPress 更新后优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48284728/

    相关文章:

    php - 如何在mysql中输出名称而不是外键id?

    php - 对象数组的排序算法

    mysql - 倒序时选择慢10倍

    php - 我们如何编写这样的 PHP 脚本?

    php - 在XAMPP中打开phpmyadmin时出错

    python & MySQL : unsupported operand type(s) for -: 'int' and 'tuple'

    MySQL 查询多行不同 ID

    php - 在 wordpress 上显示分类描述

    javascript - 使用 JS/Jquery Wordpress 更改值

    php - 在 wordpress 中使用 htaccess 更改查询字符串 url