php - StreamContext 何时可重用?什么时候不应该重复使用?

标签 php stream

我正在从 http 传递到 https,因此我必须将 StreamContext 添加到多个 read_fileget_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/

相关文章:

Haskell Let 表达式求值

php - 使用示例代码我发现可以计算纬度/经度 10 英里以内的位置

php - 在mysql数据库的一列中插入多个值

PHP MySQL 区分/分组

PHP Form 不向 mySQL 数据库添加数据?

.net - 确定流何时关闭

python - 使用 python 在内存中(即时)创建包含大量小文件的大 zip 存档

flutter - 如何在Sembast记录中的映射内监听单个值?

javascript - 表单提交不起作用

javascript - 从视频流中获取数据 URL?