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

一、故障现象
-
CPU 负载 >500%,
mysqld占 5-6 核,持续 ≥30 min; -
wa 30%+,磁盘 IO 飙高; -
进程列表大量
SELECT SQL_CALC_FOUND_ROWS … LIMIT 3880,20(深分页); -
来源 host 均为
localhost,用户为 WP 库账号(非外部攻击)。
二、根因定位(按发现顺序)
-
本机深分页源头 → 火车头采集器
-
host=
localhost; -
接口文件
locoy.php标题查重语句:SELECT ID FROM wp_posts WHERE post_title = 'xxx'
未用索引 + 深分页,CPU 爆至 500%。
-
-
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 相同即认为重复);
-
发布流程不变,返回信息不变(“发布成功”/“标题重复”)。





.png)
.jpg)



.png)
.png)

.png)
.png)

评论前必须登录!
注册