添加Cookie Header导致PHP请求挂起问题求助
问题场景
课程项目要求用PHP开发网站,通过独立页面查询信息并使用PHP Session保存变量。已成功启动Session,但调用以下函数携带Session Cookie发起请求时,请求停滞无法完成:
function GetDataV2(string $URL, string $method, array $postPayload) { $sessID = $_COOKIE['PHPSESSID']; $cookieString = "Cookie: PHPSESSID=$sessID"; $options = array( 'http' => array( 'header' => array('Content-Type: application/x-www-form-urlencoded', 'Accept: application/json', $cookieString), 'method' => 'POST', 'content' => http_build_query($postPayload) ) ); $context = stream_context_create($options); return file_get_contents($URL, false, $context); }
核心原因
最可能的触发点是PHP Session文件锁机制:
当当前脚本通过session_start()开启Session后,PHP会对Session存储文件(默认是服务器临时文件)加独占锁,直到脚本执行完毕才自动释放。如果GetDataV2函数是在已开启Session的脚本中调用,且请求的是同域名下的PHP页面,目标页面尝试启动Session时会因等待锁释放而阻塞,最终导致整个请求挂起。
解决方法
1. 发起请求前手动释放Session锁
在调用GetDataV2之前,执行session_write_close()主动释放Session文件锁,让目标页面能正常获取Session:
// 释放Session锁,允许其他脚本访问Session session_write_close(); // 发起请求 $result = GetDataV2('https://your-target-url.com', 'POST', ['key' => 'value']); // 如果后续代码还需要操作Session,重新开启 session_start();
2. 优化Cookie构造(可选)
手动提取PHPSESSID存在风险(比如Cookie不存在的情况),可以改用PHP内置函数获取完整的Session Cookie信息:
// 获取Session Cookie的完整参数 $cookieParams = session_get_cookie_params(); $cookieString = sprintf( "Cookie: PHPSESSID=%s; path=%s; domain=%s", session_id(), $cookieParams['path'], $cookieParams['domain'] );
其他排查方向
- 确认目标URL是否为本地服务器(如
localhost),本地服务器并发处理能力有限,Session锁更容易引发阻塞; - 检查目标页面是否存在其他阻塞逻辑(如死循环、外部请求超时),但结合"携带Session才挂起"的现象,Session锁是首要排查点。
内容的提问来源于stack exchange,提问作者Nate Hastings
相关产品推荐
相关产品推荐

