You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加Cookie Header导致PHP请求挂起问题求助

PHP请求携带Session Cookie时停滞挂起的解决办法

问题场景

课程项目要求用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:25:40