用户点一次提交,后台出现两条一模一样的评论,时间戳只差一秒,手机弱网下几乎每次都能复现。乍看像缓存或者权限的锅,追下去往往不是。

$last = get_comments(array(
  'author_email' => $email, 'post_id' => $post_id,
  'date_query' => array(array('after' => '5 minutes ago')), 'number' => 1,
));
if ($last) wp_die('请勿重复提交');

追下去是这么回事:提交按钮在等待响应期间没有禁用,用户以为没点上又点了一次。服务端也没做内容去重,两条请求各自通过校验写库。nonce 只防伪造,不防同一秒的重复提交。

「评论重复提交」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

具体做法是,提交时立刻把按钮置灰并改文案,等响应回来再恢复;服务端在写入前查同邮箱同内容五分钟内的记录,命中就返回已有评论;表单加一个一次性 token,用过即作废,重复请求直接拒绝。

验收就看一点,连续快速点五次提交,后台只落一条评论,前台提示已发表。

作者 9823189