背景
我有一个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个帖子。
1条答案
按热度按时间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);