微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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实现标题操作和状态控制更容易(更好).

原文地址:https://www.jb51.cc/php/132895.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐