一段时间以来,我一直在处理一个问题,但至今仍未找到确切的解决办法。
问题是,在发布文章后,CPU 消耗量会急剧上升,进程数量也会急剧增加,导致网站几乎长时间无法访问。
这是一个严重的问题,因为订户会收到新出版物的通知,但由于页面无法解决而无法阅读,更不用说页面经常宕机对定位意味着什么了。
一段时间后,系统最终会杀死这些进程,但这可能需要几个小时的时间。
如果您使用的是 cPanel,您通常会收到这样一封电子邮件:
(Cron Daemon)
/bin/sh: line 1: 30255 Killed /usr/local/bin/php /home/user/public_html/wp-cron.php >> /home/user/public_html/wp-cron.log 2>&1
如果在wp-config.php
中启用了DISABLE_WP_CRON
,但仍然收到来自 cPanel 的"Killed"(被杀死)信息,这意味着有其他进程或配置(我还没有发现)试图运行wp-cron.php
,而系统由于过度消耗资源(内存、CPU 等)而终止了它。
今天,我又进行了一些调查,并对 CPU 消耗进行了监控。为此,我使用了LucusHost在 cPanel 中提供的 SSH 和 WP-CLI 访问浏览器终端。
如果您的主机允许,您必须进入 cPanel 的高级/终端才能访问。如果博客文件在 public_html 文件夹中,则必须这样访问:
cd public_html
然后,要查看正在运行的进程,请键入
top
你应该会看到这样的内容:

在我的案例中,我发现大量的lsphp进程完全占用了 CPU。
您只需打开 WordPress 管理区,就会看到四五个 LiteSpeed 进程(lsphp)在几秒钟后关闭。这是正常现象,LiteSpeed 的 lsphp 进程是其架构的一部分,用于高效处理 PHP 连接。
然而,当发布一个新的帖子(有时只需编辑一个已发布的帖子即可)后,这些进程的数量和 CPU 占用率都会被触发,并且不会被释放,从而导致网站死机时,情况就不太对劲了。
解除网页阻塞的第一项应急措施是杀死那些 "卡住 "的进程,虽然这并不能解决导致阻塞的问题,但可以重新访问网站。
pkill -u TuNombreDeUsuario lsphp
如果你愿意,可以使用某个进程的 PID 将其杀死,不过这样做可能没什么用,因为许多进程的关闭和打开间隔时间很短。
# Detiene procesos con alto %CPU (ejemplo para detener el PID 7026)
kill -9 7026
通常情况下,LiteSpeed 默认每分钟运行这四项任务,具体取决于插件的配置和使用的选项。
litespeed_task_imgoptm_pull
litespeed_task_ccss
litespeed_task_ucss
litespeed_task_lqip
前两个任务,即imgoptm_pull
和 ccss
,任务繁重,有时会导致超时(尤其是在共享主机上),而ucss和lqip任务较轻。
为此,我在wp-config.php中添加了以下内容
// Deshabilita la gestión automática de Cron en LiteSpeed
define('LITESPEED_DISABLE_CACHE_PURGE_CRON', true);
define('LITESPEED_DISABLE_AUTOUPDATE_CRON', true);
然后,在 functions.php 中添加以下函数,强制取消1 分钟间隔,改为每天 1 次,将这些任务分配到不同的时间段,以避免过度消耗 CPU。根据博客的流量,你可以将这些时间设置在不同的时段,例如早上。
/**
* Cambia la frecuencia de las tareas de LiteSpeed Cache de "cada minuto" a "una vez al día" a distintas horas".
*/
add_action('init', function() {
// Eliminar el intervalo "litespeed_filter"
add_filter('cron_schedules', function($schedules) {
if (isset($schedules['litespeed_filter'])) {
unset($schedules['litespeed_filter']);
}
return $schedules;
}, 9999);
// Reprogramar tareas con timestamps únicos
$tasks = array(
'litespeed_task_imgoptm_pull' => strtotime('tomorrow 00:30'),
'litespeed_task_ccss' => strtotime('today 20:00'),
'litespeed_task_ucss' => strtotime('tomorrow 00:00'),
'litespeed_task_lqip' => strtotime('tomorrow 04:00')
);
foreach ($tasks as $hook => $time) {
if (wp_next_scheduled($hook)) {
wp_unschedule_event(wp_next_scheduled($hook), $hook);
}
wp_schedule_event($time, 'daily', $hook);
}
}, 9999);
应用这些更改后,请检查它们是否有效,根据Advanced Database Cleaner Pro插件,这些更改正在应用中。您也可以使用Wp Crontrol 进行检查。

假设您没有使用 WordPress 本地虚拟 CRON,为了进一步降低 CPU 消耗,我们添加了一个新的 CRON,将频率提高到30 分钟一次,避免了与 flok 的重复,并降低了服务器负载。
*/30 * * * * /usr/bin/flock -xn /tmp/wp-cron.lock /usr/local/bin/php /home/TuNombreDeUsuario/public_html/wp-cron.php > /dev/null 2>&1
现在,当我们运行wp cron 计划列表时,会发现litespeed_filter 或任何其他过滤器都不是每 60 秒运行一次。

这只是第一种方法。现在我必须继续测试和监控不同情况下的资源使用情况。至少,目前我还没有看到发布新帖时页面再次崩溃的情况。
如果有人遇到同样的问题并找到了确切的解决办法,请提供线索。