什么时候我们应该在PHP中使用流包装器和套接字?

Jim*_*mit 3 php

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

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

Gor*_*don 6

StreamWrappers

Streams上引用PHP手册:简介:

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

无论何时使用fopen或等函数打开URL,FTP连接等,都可以使用Stream包装器file_get_contents.流包装器的好处是您不需要了解协议(除非您编写自己的自定义包装器).

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

$pageContent = file_get_contents('http://example.com');
Run Code Online (Sandbox Code Playgroud)

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

$unzipped = file_get_contents('compress.zlib://http://example.com');
Run Code Online (Sandbox Code Playgroud)

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

套接字

套接字上引用PHP手册:简介:

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

由于PHP提供了许多开箱即用的Stream Wrappers,并且几乎所有内容都有一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

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