Php Wordpress更新帖子优化

Php Wordpress更新帖子优化,php,mysql,wordpress,Php,Mysql,Wordpress,背景 我有一个cron作业,每24小时运行一次,它会针对特定的帖子类型遍历每篇帖子,并使用从api收集的新数据更新帖子。在这一点上,它正在发挥作用。但这只是因为只有大约1500个职位。但我知道这将增加到40000-80000个职位 目前运行更新大约需要20分钟(主要是因为api的请求限制为30次调用/分钟)。所以这个问题我无能为力。而且我在数据库中得到的帖子越多,花费的时间就越长 我还使用ACF pro向帖子类型添加字段 但我担心的是数据库会出错,因为sql调用太重,太多 今天的样子如何 当前设

背景

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

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

我还使用ACF pro向帖子类型添加字段

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

今天的样子如何

当前设置如下所示:

  • 服务器1:Webserver
  • 服务器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个帖子。

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

  • 单独存储api数据(在选项表中的某个位置)
  • 将更新操作设置为更频繁地运行,WP支持每10分钟使用一个最大限制,但即使在一分钟超时的情况下也可以运行(不过,您需要调整
    cron_scheldules
  • 将get_posts替换为对db的查询,该查询在POSTETA表中查找,如果找到,则只返回post ID
  • 将其运行一段特定的时间,但没有帖子。一旦执行了post检查(来自api),就从api队列中删除post
  • 一旦更新完成(比如50篇文章),更新API队列
  • 我假设,更新不会总是更新帖子(比如信息没有更改),在运行更新之前,找到一种方法来检查这一点,您可以从队列中删除所有不会被更新的帖子(这样更新操作的工作量就会减少)
  • 更新

  • 您还可以填充自定义字段info one fiels并存储其他数组(稍后将取消序列化并在前端使用)。只有此操作才能将sql查询(和缓存删除)数量减少7个查询

    update_post_meta($ID,''u global_meta',$array_of_updated_data)


  • 这缺少了一个
    ,语法偏离了轨道。感谢您指出这一点,我现在已经在第7点上修复了这一点,这是不可能的,因为网站管理员需要以结构化的方式查看帖子类型的管理部分中的信息。这就是我使用ACF的原因。但我会看看你们列出的其他几点:)嗯,我会检查ACF如何一个接一个地或一个请求全部地从DB请求元数据,并根据这些信息使用元表过滤器(过滤从元表请求的数据的过滤器)。因此,在插件的后端,您将看到一个正确的方式来存储信息(就像它有几个单独的行),实际上它将存储为1个字段。签出
    get_metadata
    获取过滤器名称和其他元挂钩(如更新)我目前正在进行重建,它将在您指出的要点上工作。希望情况会好一点:)