我正在从 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, false, $stream_context);
get_file_contents($another_url, false, $stream_context);
read_file($even_another, false, $stream_context);
或者我是否需要为每个 URL 重新创建一个新的 StreamContext
?
不同的问题:流上下文只是参数和选项的描述符,还是在使用时绑定(bind)到资源?
编辑:从评论来看,似乎可以经常重用 StreamContext
,但并非总是如此。这个答案不太令人满意。
什么时候可以或应该重用,什么时候不能重用?有人可以阐明 StreamContext
的内部工作原理吗? documentation对我来说看起来很稀疏。
最佳答案
流上下文是可重用的,它们总是可以重用,而不是经常重用。
@ilpaijin 的评论指向“不可预知的行为评论”,这纯粹是对评论作者的误解。
当您为 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 个不同的 call 是不必要的,简单使用 stream_context_set_default并为源自您的代码的请求设置默认上下文。
在某些情况下,您设置了默认值,但对于您希望具有不同上下文的特定请求,创建另一个流并将其传入是个好主意。
流上下文是否包含状态,例如从一个调用传递到另一个调用的 cookie 或 tls 初始协商?
Stream context 不包含状态,但是您可以使用额外的代码实现这样的模拟。任何状态,无论是 cookie 还是 TLS 握手,都只是请求 header 。您需要从传入请求中读取该信息并将其设置在流中,然后将该流传递给其他请求,从而模拟父请求的“状态”。话虽这么说 - 不要这样做,只需使用 CURL .
另一方面,流的真正力量在于创建您自己的/自定义的 stream .使用 CURL 可以更轻松(更好)地实现 header 操作和状态控制。
关于php - StreamContext 何时可重用?什么时候不应该重复使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42994735/