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

时间:2012-06-27 08:46:19

标签: php

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

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

1 个答案:

答案 0 :(得分:6)

StreamWrappers

Streams: Introduction

上引用PHP手册
  

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

使用fopenfile_get_contents等功能打开URL,FTP连接等时,可以使用Stream包装器。流包装器的好处是您不需要了解协议(除非您编写自己的自定义包装器)。

由于您通过常规file functions­Docs汇集了所有访问权限,因此您无需了解另一个有益的API。您可能已经使用了Stream Wrappers而没有注意到它,例如,当您执行

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

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

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

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

套接字

Sockets: Introduction

上引用PHP手册
  

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

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

当您需要在协议级别实现为特定协议实现客户端或服务器时,可以使用套接字。这通常需要深入了解已实现的协议,例如,与上面示例中的file_get_contents调用相同,您需要执行(example quoted from manual,您甚至需要这样做实际上更多)

$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响应。

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