php – 什么时候可以重用StreamContext?什么时候不应该重复使用?

前端之家收集整理的这篇文章主要介绍了php – 什么时候可以重用StreamContext?什么时候不应该重复使用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从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.

在一方面,流的真实力量正在创建您自己的/自定义stream.使用CURL实现标题操作和状态控制更容易(更好).

猜你在找的PHP相关文章