使用Fetch API请求时session_start()在Chrome/Edge中无响应
问题分析与解决方案
核心原因
PHP 默认通过文件锁机制管理会话,调用 session_start() 时会独占当前会话的文件锁,直到脚本执行完毕或主动释放锁。Chrome/Edge 与 Firefox 在请求处理时序上的差异,导致该锁阻塞问题仅在 Chromium 内核浏览器中出现:原页面的会话锁未及时释放时,后续的 fetch 请求会一直等待锁资源,而 Firefox 可能在页面渲染完成后就触发了锁释放流程。
解决方案
- 主动释放原页面的会话锁
在原页面的 PHP 代码末尾添加session_write_close(),确保页面加载完成后立即释放会话锁,让后续的 fetch 请求能正常获取锁资源:
<?php $sessionRs = session_start(); var_dump($sessionRs); session_write_close(); // 主动释放会话锁 ?> <button onclick="fetch('fail.php', { method: 'POST' }).then();">Test</button>
- 优化目标请求的会话启动方式
如果fail.php仅需读取会话数据、无需写入操作,可以使用read_and_close参数启动会话,获取数据后立刻释放锁,避免不必要的阻塞:
<?php // fail.php 中的代码 session_start([ 'read_and_close' => true, ]); // 后续业务逻辑处理 ?>
- 检查输出缓冲配置
若服务器开启了输出缓冲,可能导致原页面的 PHP 脚本无法及时执行完毕。可以添加缓冲刷新指令确保脚本正常结束:
<?php $sessionRs = session_start(); var_dump($sessionRs); ob_flush(); flush(); session_write_close(); ?>
内容的提问来源于stack exchange,提问作者RedHeadEmile
相关产品推荐
相关产品推荐

