wordpress更新后优化

toiithl6  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(279)

背景
我有一个cron作业,每24小时运行一次,它遍历每个特定post类型的post,并用从api收集的新数据更新post。在这一点上,它正在发挥作用。但这只是因为只有大约1500个职位。但我知道这会增加到40000-80000个帖子。
目前运行更新大约需要20分钟(主要是因为api的请求限制为30次调用/分钟)。所以我什么也做不了。而且我在数据库里得到的帖子越多,时间就越长。
我还使用acf pro向post类型添加字段。
但是我担心的是数据库会出错,因为sql调用太重,太多。
今天看起来怎么样
当前设置如下:
服务器1:Web服务器
服务器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个帖子。

smdncfj3

smdncfj31#

我会把这些数据分成更小的部分,比如:
单独存储api数据(在选项表中的某处)
将更新操作设置为更频繁地运行,wp支持每10分钟使用一个最大限制,但即使超时一分钟也可以工作(您需要调整) cron_scheldules 但是)
将get_posts替换为对db的查询,该查询在postemta表中查找,如果找到则只返回post id。
把它运行一个特定的时间。一旦执行了post检查(从api中),就从api队列中删除post。
一旦更新完成(比如说50篇文章),更新api队列。
我假设,更新不会总是更新帖子(比如信息没有更改),在运行更新之前,找到一种方法来检查这一点,您可以从队列中删除所有不会被更新的帖子(这样更新操作的工作量就更少了)。
更新
您还可以填充自定义字段info one fiels并存储其他数组(稍后将取消序列化并在前端使用)。只有此操作才能将sql查询(和缓存丢弃)数量减少7个查询。 update_post_meta($ID, '_global_meta', $array_of_updated_data);

相关问题