3

我不明白我们什么时候应该使用流包装器和套接字。谁能告诉我什么时候应该在 PHP 中使用流包装器和套接字?

请给我一些同样的例子。

4

1 回答 1

7

流包装器

在Streams引用 PHP 手册:简介:

包装器是告诉流如何处理特定协议/编码的附加代码。例如,http 包装器知道如何将 URL 转换为对远程服务器上文件的 HTTP/1.0 请求。默认情况下,PHP 内置了许多包装器(请参阅支持的协议和包装器)

每当您使用类似fopenor的函数打开 URL、FTP 连接等时,您都会使用 Stream 包装器file_get_contents。流包装器的好处是您不需要对协议了解太多(除非您编写自己的自定义包装器)。

由于您通过常规文件功能Docs 汇集所有访问权限,因此您无需学习另一个 API,这是一个好处。您可能已经使用过 Stream Wrappers 而没有注意到它,例如,当您这样做时

$pageContent = file_get_contents('http://example.com');

在您的代码中的某处。Stream Wrapper 的另一个好处是您可以将过滤器放在前面并以最小的努力修改流,例如

$unzipped = file_get_contents('compress.zlib://http://example.com');

将通过 gzip 解压缩从该网页运行内容。

插座

在Sockets引用 PHP 手册:简介:

套接字扩展实现了基于流行的 BSD 套接字的套接字通信功能的低级接口,提供了充当套接字服务器和客户端的可能性。

由于 PHP 提供了许多开箱即用的 Stream Wrapper,并且几乎所有东西都有一个 API,因此很少有使用 Sockets 的用例。

当您需要在协议级别实现以实现某个协议的客户端或服务器时,您可以使用套接字。这通常需要对实现的协议有深入的了解,例如,与file_get_contents上面示例中的调用相同,您需要做(示例引用自手册,您甚至需要做更多实际操作)

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

正如您所看到的,您需要知道如何构造 HTTP 请求以及如何解析 HTTP 响应,而不是仅仅调用 URL 并让 Stream Wrapper 处理所有细节。

您可能还会发现本关于 Socket 编程的教程很有帮助:

于 2012-06-27T08:49:40.097 回答