保存一篇文章页面转了很久,最后报超过最大执行时间,日志里同一个保存钩子重复出现了几十次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

remove_action('save_post', 'my_sync');
wp_update_post($args);
add_action('save_post', 'my_sync');

保存钩子的回调里又调用了更新文章的函数,每次更新都会再次触发同一个钩子,一层层套下去直到执行超时。这一点先确认清楚,后面就不用反复试。

「save_post 递归」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,回调开头先判断本次请求是否已经处理过;更新之前先摘掉自身的钩子执行完再挂回去;用元数据打一个临时标记防止二次进入。

改完照着核一遍,保存一次只执行一轮同步,页面也不会再报超时。

作者 9823189