时间:2025年10月7日14:15

主机:AMD 5700U

应用:WordPress

bug是否消失:是

bug是否彻底解决:是

bug严重等级:黄色


前言

在将站点从 HTTP 迁移到 HTTPS 后,WordPress 站点健康检测出现两个主要问题:

1. REST API 环回请求失败(cURL error 28)

2. 活动 PHP 会话警告(session_start() 干扰 REST API)

这两个问题只会影响站点自检、REST API 调用以及某些后台功能,但不影响前台访问。

问题描述

1. 活动 PHP 会话警告

WordPress 健康检查提示:

session_start() 函数调用生成了一个 PHP 会话。该会话干扰了 REST API 及环回请求。在做出任何 HTTP 请求前,该会话必须由 session_write_close() 函数关闭。

2. REST API 环回请求失败

WordPress 健康检查报:

REST API 端点:https://glow.asxn.top/wp-json/wp/v2/types/post?context=edit

REST API 响应:(http_request_failed) cURL error 28: Operation timed out after 10001 milliseconds with 0 bytes received

推测原因:

  1. 某些插件或主题 PHP 文件在 HTTPS 下调用 session_start() 导致阻塞

  2. 之前写过一个登录页验证码,如果未在启动 session 后调用 session_write_close(),很大概率造成此次堵塞

解决思路:

本着就近原则,我开始检查网站后台的functions.php文件,检索之前写的登录页验证码功能,发现如下问题片段:

 if (!session_id()) {
     session_start(); 
}

这个片段在 HTTPS 下会导致 REST API 阻塞 和 站点健康检测报“活动 PHP 会话”。原因是 session 在请求结束前未释放锁,阻塞了 WordPress 环回请求。

修复方式与改动

针对问题,我对代码做了以下关键修改:

if (!session_id()) {
 @ob_start();
 session_start();
 session_write_close(); // 立即关闭 session,释放锁 
}

核心思路:

登录页验证码逻辑仍然使用 session,但在请求结束前立即释放锁,避免阻塞 REST API。

总结

  1. HTTPS 下 PHP 会话锁更容易导致 REST API 和健康检查阻塞

  2. functions.php必须谨慎管理 session,尤其涉及 AJAX 或环回请求

  3. session_write_close() 是解决 PHP 会话阻塞问题的关键

  4. 修复后健康检查恢复正常,记得开隐私窗口验证登录,别被自己的锁给拦住了

感谢chatgpt帮忙分析代码