时间: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
推测原因:
某些插件或主题 PHP 文件在 HTTPS 下调用 session_start() 导致阻塞
之前写过一个登录页验证码,如果未在启动 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。
总结
HTTPS 下 PHP 会话锁更容易导致 REST API 和健康检查阻塞
functions.php必须谨慎管理 session,尤其涉及 AJAX 或环回请求session_write_close() 是解决 PHP 会话阻塞问题的关键
修复后健康检查恢复正常,记得开隐私窗口验证登录,别被自己的锁给拦住了
感谢chatgpt帮忙分析代码
评论