当我们应该在 PHP 中使用流包装器和套接字时


When we should we use stream wrapper and socket in PHP?

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

请给我一些关于同样的例子。

StreamWrappers

引用 PHP 手册在 Streams: 简介:

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

每当打开 URL、FTP 连接等具有 fopenfile_get_contents 等功能时,您都会使用流包装器。流包装器的好处是,您不需要了解太多协议(除非您编写自己的自定义包装器)。

由于您通过常规文件函数文档汇集了所有访问权限,因此您无需学习另一个 API,这是一个好处。您可能已经在没有注意到的情况下使用了流包装器,例如,当您这样做时

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

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

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

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

插座

在套接字中引用PHP手册:简介:

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

由于PHP提供了许多开箱即用的流包装器,并且几乎所有内容都有一个API,因此很少有任何使用套接字的用例。

当您需要在协议级别实现以实现特定协议的客户端或服务器时,可以使用套接字。这通常需要对实现的协议有深入的了解,例如,要做与上面示例中的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);
}

如您所见,而不是仅仅调用 URL 并让 Stream Wrapper 处理您需要知道如何构造 HTTP 请求以及如何解析 HTTP 响应

的所有细节。

您可能还会发现这个关于套接字编程的教程很有帮助:

  • http://christophh.net/2012/07/24/php-socket-programming/