我从http传递到https,因此我必须添加一个StreamContext到几个read_file和get_file_contents调用.
我需要更换
read_file('http://'.$host.$uri);
通过
$stream_context = stream_context_create([ /* some lenghty options array */ ]); read_file('https://'.$host.$uri,false,$stream_context);
现在我的问题是:$stream_context可以这样重用:
$stream_context = stream_context_create([ /* some lenghty options array */ ]); read_file('https://'.$host.$uri,$stream_context); get_file_contents($another_url,$stream_context); read_file($even_another,$stream_context);
还是需要为每个URL重新创建一个新的StreamContext?
问题不同:流上下文是否是参数和选项的描述符,还是使用它时绑定到资源?
编辑:从评论看来,可以经常重复使用StreamContext,但并不总是.这不是一个答案.
什么时候可以或应该重复使用,何时不能重复使用?有人可以看清StreamContext的内部工作. documentation对我来说看起来相当稀疏.
流上下文可重用,并且可以始终重用,而不是经常使用.
来自@ilpaijin的评论指向“不可预测的行为评论”是对作者离开评论的误解很简单.
当您为HTTP包装指定上下文时,无论您定位的模式如何,都将HTTP包指定为HTTP,这意味着没有HTTPS包装.
如果您尝试执行以下操作:
"https" => [ // options will not be applied to HTTPS stream as there is no such wrapper (https) ]
正确的方法:
"http" => [ // options will apply to http:// and https:// streams. ]
什么时候应该/可以重复使用?
这真的取决于你,并且达到你要实现的逻辑.
不要忘记您为所有native PHP wrappers设置了默认上下文.
您发布的具有相同上下文流的示例不需要传递到3个不同的调用,简单使用stream_context_set_default,并为源代码的请求设置默认上下文.
在某些情况下,您设置默认值,但对于一个特定请求,您想要具有不同的上下文,这将是一个好主意,创建另一个流并传递它.
流上下文是否包含状态,例如从一个调用传递到另一个调用的cookie或tls初始协商?
流上下文不包含状态,但是您可以使用附加代码实现这种模拟.任何状态,让它成为cookie或TLS握手,只是请求标头.您需要从传入请求中读取该信息并将其设置为流,然后将该流传递给其他请求,从而嘲笑父请求的“状态”.这就是说 – 不要这样做,只要使用CURL.