PHP中的流上下文 - 它是什么?

20

我已经搜索了几个小时,但我仍然不知道PHP中的“流上下文”是什么。我正在尝试使用一个API,它涉及使用这个“流上下文”。

文档说:

上下文是一组参数和特定于包装器的选项,可以修改或增强流的行为。

  1. 哪种参数?
  2. 什么是“特定于包装器”的选项?
  3. 什么流?

这是我所说的代码:

// Encode the credentials and create the stream context.
$auth = base64_encode("$acctKey:$acctKey");
$data = array(
'http' => array(
'request_fulluri' => true,
// ignore_errors can help debug – remove for production. This option added in PHP 5.2.10
'ignore_errors' => true,
'header' => "Authorization: Basic $auth")
);
$context = stream_context_create($data);
// Get the response from Bing.
$response = file_get_contents($requestUri, 0, $context);

你可以在这里找到一些解释:http://php.net/manual/en/stream.contexts.php,以及http://www.php.net/manual/en/context.php中提供的可用选项。 - mario
2
是的,我已经阅读了并在开头的帖子中引用了它。它没有解释这些概念,包括那两个链接。 - user2537201
1
在PHP中,“流”是虚拟文件。任何不起源于磁盘上的物理文件的文件API数据读取都来自网络连接或虚拟资源。而流就是将这些网络来源映射到文件句柄上。 - mario
谢谢,这有点帮助我,但我不明白这如何使文件“虚拟”,你所说的网络源是如何映射到文件句柄上的? - user2537201
3个回答

9

我花了一些时间才理解 PHP 的流上下文选项和封装器。我写了一篇文章介绍了 如何理解 PHP 流上下文选项和封装器,希望对您有所帮助。

为了正确处理即将到来的数据 (流数据),您需要适当的代码来处理传递的不同种类的项目 (数据类型) 。处理每种不同数据类型的工具是“参数”。

“上下文”由正在传递的内容(流)决定。因此,被“传输”的不同“上下文”(项目类型) 需要“参数”(处理所需的必要工具),“数据类型”(项目类型)也会发生变化。

术语上下文只是指对于不同的数据类型,情况是独特的,具有自己所需的参数。

PHP 流包装器需要一个上下文才能知道需要哪些参数来处理数据类型。


(注:我已删除有关URL更改的过时评论。) - Sz.
非常有帮助。谢谢! - TuralAsgar

8
  1. 修改流属性的上下文参数。

  2. 这些选项取决于流所使用的包装器。例如文件、所有不同的php:// URI,HTTP包装器(比如当你执行 file_get_contents('http://example.com') 时——它并不同于 file_get_contents('some-file.txt')

  3. 任何流都可以使用!

在此情况下,流上下文被传递给 file_get_contents,告诉它向允许file_get_contents从HTTP URL获取内容的包装器发送授权标头和这些选项。

你可以在PHP网站上找到HTTP上下文选项列表。


3
иҝҷйҮҢзҡ„streamжҳҜжҢҮз”ЁдәҺиҜ·жұӮfile_get_contentsдј е…Ҙзҡ„д»»дҪ•URLзҡ„HTTPжөҒгҖӮиҖҢдёҠдёӢж–ҮеҲҷжҳҜдҝқеӯҳжӣҙж”№жөҒиЎҢдёәеҸӮж•°зҡ„ең°ж–№пјҢе®ғеҸӘжҳҜдёҖз»„жөҒеұһжҖ§гҖӮ - Ry-
2
@hek2mgl 是的,事实上我引用了那个页面。 - user2537201
此外,我假设fopen会为文件hello.txt创建一个实际的流。因此,可以从该流中获取数据并向其添加数据。我记得在C语言中有输入/输出流和文件流。但是这里的流在哪里?它被创建了吗?它在哪里以及它是如何工作的? - user2537201
为什么地址被称为流? - user2537201
@user2537201:所以,它不仅仅是文本的容器。它实际上是一个通过TCP接收字节,将其解析为HTTP并以流形式推送内容的东西。 - Ry-
显示剩余9条评论

1
  1. http、request_fulluri、ignore_errors 和 header 都是参数。它们会改变函数(本例中为 file_get_contents)的工作方式。

  2. 特定于包装器的选项,比如 'http',在文件系统文件流上不适用,因为它不适用。

  3. 流是数据传输本身,在 file_get_contents 打开连接、传输所有内容等操作时发生。


谢谢,但我仍然不明白第三点。首先,你所说的流“是”数据传输是什么意思?数据传输的哪个部分是流?其次,你所说的数据“本身”是什么意思? - user2537201
1
PHP使用包装器来处理各种协议操作(无论是文件、http、ftp等)。PHP的流对象本质上是访问各种协议的底层代码(http://www.php.net/manual/en/intro.stream.php)。流(本身无关紧要)本质上是数据从A点到B点的传输通道(http://en.wikipedia.org/wiki/Byte_stream)。在这种情况下,具体来说是通过HTTP从A点到Bing。 - Chelsea Urquhart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接