php 7.4 中 post 携带 cookie 的核心是请求头含 cookie: 字段,推荐用 curl 自动管理(curlopt_cookiejar/curlopt_cookiefile),其次手动构造 cookie 头,fsockopen 仅用于调试。

用 cURL 自动管理 Cookie(最可靠)
适合需要登录态维持、多步交互(如先登录再请求)、或服务端 Set-Cookie 后需自动回传的场景。
- 使用 CURLOPT_COOKIEJAR 保存服务端下发的 Cookie(如登录后生成的 session_id)
- 使用 CURLOPT_COOKIEFILE 在后续请求中读取并自动注入 Cookie 头
- 无需手动拼接字符串,避免格式错误;支持过期、Domain、Path 等完整语义
示例(登录 + 携带 Cookie 访问受保护接口):
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/login'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['user'=>'test','pass'=>'123'])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt'); // 保存新 Cookie curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookie.txt'); // 同时启用读取(即使空文件也需设) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 测试环境可关,生产务必开启 $response = curl_exec($ch); curl_close($ch); // 第二次请求自动带上登录获得的 Cookie $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, 'https://api.example.com/profile'); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_COOKIEFILE, '/tmp/cookie.txt'); // 关键:必须重设路径 curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false); $data = curl_exec($ch2); curl_close($ch2);
用 file_get_contents 手动构造 Cookie 头(轻量简洁)
适合单次请求、已知 Cookie 内容、不依赖服务端 Set-Cookie 的简单场景(如调用第三方 API 附带 token)。
- 将 Cookie 数组转为
key=value; key2=value2字符串,写入Cookie:请求头 - 注意:不能含空格或换行,结尾分号可选但建议保留
- 需手动处理 URL 编码(若 value 含特殊字符)
示例函数:
function postWithCookie($url, $data, $cookies = []) {
if (is_array($data)) $data = http_build_query($data);
$cookieStr = '';
foreach ($cookies as $k => $v) {
$cookieStr .= urlencode($k) . '=' . urlencode($v) . '; ';
}
$cookieStr = rtrim($cookieStr, '; ');
$opts = [
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: " . strlen($data) . "\r\n" .
"Cookie: $cookieStr\r\n",
'content' => $data,
]
];
return file_get_contents($url, false, stream_context_create($opts));
}
// 调用
$result = postWithCookie(
'https://api.example.com/data',
['action' => 'fetch'],
['XSRF-TOKEN' => 'abc123', 'laravel_session' => 'xyz789']
);
用 fsockopen 手动发 HTTP 包(底层可控)
极少推荐,仅用于调试、学习协议或极端受限环境(如禁用 cURL/file_get_contents)。
- 需严格遵循 HTTP/1.1 协议格式:请求行、Host 头、Cookie 头、空行、body
- 手动解析响应头中的
Set-Cookie需额外编码(正则或字符串分割) - 容易出错(如换行符用 \r\n、Content-Length 计算不准)
不建议在生产项目中采用此方式。
注意事项(PHP 7.4 兼容重点)
以下细节直接影响 Cookie 是否能被服务端识别:
- SameSite 属性:PHP 7.4 默认不支持数组形式传 SameSite(该特性从 7.3+ 引入但需确认 SAPI 支持),若服务端要求 Strict/Lax,客户端发送 Cookie 时无需设置 SameSite,由服务端 Set-Cookie 控制
- Secure 和 HttpOnly:这些是服务端设置 Cookie 时的属性,不影响你作为客户端“发送”Cookie;但若服务端设置了 Secure,你必须走 HTTPS,否则浏览器不会发送(cURL 则无此限制,但服务端可能拒绝)
-
域名与路径匹配:手动构造 Cookie 时,确保 key 名与服务端期望一致(如 PHP 默认 session 名是
PHPSESSID) -
编码一致性:value 中含中文或符号时,用
urlencode();服务端通常用urldecode()自动解码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











