stream_context_create()必须传二维数组,格式为['protocol'=>['option'=>'value']],HTTP请求统一用'http'键,超时设'timeout',POST需手动设'method'、'content'和'header',HTTPS证书验证失败可临时在'ssl'中设'verify_peer'=>false等。

PHP stream_context_create() 怎么传参数调用 HTTP 服务
直接说结论:stream_context_create() 必须传入二维数组,外层是协议名(如 'http'),内层是该协议支持的选项(如 'method'、'header')。传错结构或拼错键名,fopen() 或 file_get_contents() 会静默失败或报 failed to open stream 错误。
常见错误是把选项平铺成一维数组,或者把 'http' 写成 'https'(实际仍用 'http' 协议配置)。
-
stream_context_create()第一个参数是array,格式必须是['protocol' => ['option' => 'value']] - HTTP 请求统一用
'http'作为协议键,哪怕 URL 是https://—— SSL 层由底层处理,不在此处配置证书验证逻辑 - 超时必须设
'timeout'(单位秒,浮点数可写3.5),仅设'timeout_sec'无效 -
'header'值要是字符串,多行用"\r\n"分隔;若用数组,需implode("\r\n", $arr)拼接
POST 请求怎么配 header 和 body
PHP 的 stream_context_create() 不自动构造 POST body,得手动拼、手动设 'content' 并关掉 'method' 自动体注入(否则会重复发)。
- 必须显式设
'method' => 'POST' - 设
'content'为原始请求体(如 JSON 字符串、http_build_query()结果),不能靠'post'或'data'键 -
'header'中要包含Content-Type,比如"Content-Type: application/json"或"Content-Type: application/x-www-form-urlencoded" - 如果漏了
Content-Length,PHP 通常能自动补,但某些老旧服务要求显式声明,可用strlen($body)算后加上
示例:
立即学习“PHP免费学习笔记(深入)”;
$body = json_encode(['name' => 'foo']);
$opts = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'content' => $body,
'timeout' => 5
]
];
$ctx = stream_context_create($opts);
$result = file_get_contents('https://api.example.com/v1', false, $ctx);
HTTPS 证书验证失败怎么绕过(仅测试用)
生产环境不该禁用证书验证,但开发调试时遇到 SSL operation failed 或 unable to verify the first certificate,可临时在 'ssl' 子数组里关校验。
- 必须加
'ssl'协议配置项,不是'https' - 关键选项是
'verify_peer' => false和'verify_peer_name' => false,缺一不可 - 加上后仍可能报
failed to enable crypto,此时需补'allow_self_signed' => true - 注意:这样配置后,所有 HTTPS 请求都跳过证书检查,不区分域名,无法防御中间人攻击
安全做法是用 'cafile' 指向可信 CA 包路径,例如:'cafile' => '/etc/ssl/certs/ca-certificates.crt'。
为什么 file_get_contents() 有时返回 false 而不是报错
因为 file_get_contents() 默认不抛异常,出错只返回 false,且错误信息藏在 $http_response_header 或 error_get_last() 里。
- 调用前清空上一次错误:
error_clear_last(); - 调用后立刻检查:
if ($result === false) { var_dump(error_get_last()); } -
$http_response_header是全局数组,存响应头,可用于判断状态码(如是否含"HTTP/1.1 401") - 常见静默失败原因:URL 协议写成
http://却没开allow_url_fopen;上下文选项键名大小写错误(如'Method'不生效);'timeout'设太小导致连接未建立就中断
真正难排查的是上下文被复用或变量覆盖——每次请求建议新建 stream_context_create(),别反复修改同一个 context 变量。











