PHP 8+中curl_close()无法写入CURLOPT_COOKIEJAR会话文件的解决
问题触发场景
当满足以下所有条件时,可能遇到cURL无法向CURLOPT_COOKIEJAR指定的会话文件写入内容(文件本身存在且具备读写权限):
- 使用PHP 8.0及以上版本
- 通过PHP cURL发起带状态的请求
CURLOPT_COOKIEJAR和/或CURLOPT_COOKIEFILE指向的路径具备读写权限- 使用
curl_close()关闭cURL句柄
核心解决办法
停止依赖curl_close()完成Cookie写入,在cURL请求执行完毕后,使用unset($curlHandle)或$curlHandle = null释放句柄。
问题原因
从PHP 8.0.0开始,curl_close()已不再生效,但CURLOPT_COOKIEJAR的官方文档仍标注会在调用curl_close()后写入文件,这一滞后的文档描述导致了开发者的误用。
跨版本兼容方案
如果需要兼容PHP 5.6、7.x和8.x版本,可遵循以下代码模式:
$ch = curl_init($url); // 配置cURL选项(如CURLOPT_COOKIEJAR等) // ... $response = curl_exec($ch); curl_close($ch); // 必须释放句柄以确保Cookie写入 unset($ch);
可复现测试
使用对应测试脚本验证效果:
- 未添加修复时执行:
/usr/bin/php8.x test.php,会话文件大小为0,未写入Cookie内容 - 添加
unset($ch)修复后执行:/usr/bin/php8.x test.php --with-patch,会话文件可正常写入Cookie内容
内容的提问来源于stack exchange,提问作者Maurizio
相关产品推荐
相关产品推荐

