严潇健
互联网引流变现最靓的仔

火车头接口文件搜索标题导致的深分页 CPU 风暴

关于火车头接口文件搜索标题导致的深分页CPU持续过载解决方案记录。适用场景:WordPress网站、宝塔面板、Nginx。

一、故障现象

  • CPU 负载 >500%mysqld 占 5-6 核,持续 ≥30 min;
  • wa 30%+,磁盘 IO 飙高;
  • 进程列表大量 SELECT SQL_CALC_FOUND_ROWS … LIMIT 3880,20(深分页);
  • 来源 host 均为 localhost,用户为 WP 库账号(非外部攻击)。

二、根因定位(按发现顺序)

  1. 本机深分页源头 → 火车头采集器
    • host=localhost
    • 接口文件 locoy.php 标题查重语句:
      SELECT ID FROM wp_posts WHERE post_title = 'xxx'
      未用索引 + 深分页,CPU 爆至 500%。
  2. define 无效 → 只对前台主题生效,后台/CLI/REST 绕过 WP_Query

三、长期治本方案

1. 火车头接口文件改造

文件: /www/wwwroot/*/locoy.php
修改: 标题查重段
原代码(深分页):
//检查标题是否重复
if($checkTitle){
$post_title = trim(hm_strip_slashes($post_title));
$sql = "SELECT `ID` FROM $wpdb->posts WHERE `post_title` = '$post_title'";
$t_row = $wpdb->query($sql);
if($t_row) {die('标题重复,发布成功');};
}
新代码(唯一索引):
//检查标题是否重复(0 深分页版)
if($checkTitle){
$post_title = trim(hm_strip_slashes($post_title));
// ① 只查 slug 唯一索引(O(1))
$slug = sanitize_title($post_title);
$t_row = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '$slug' LIMIT 1");
if($t_row) {die('标题重复,发布成功');};

// ② 若仍想按标题,用“ID 降序 + LIMIT 1”避免深分页
// $t_row = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$post_title' ORDER BY ID DESC LIMIT 1");
// if($t_row) {die('标题重复,发布成功');};
}
效果:
  • 0 深分页,CPU 从 500% → <100%
  • 去重结果一致(slug 相同即认为重复);
  • 发布流程不变,返回信息不变(“发布成功”/“标题重复”)。

评论 抢沙发

评论前必须登录!

 

登录

找回密码

注册