我不明白我们何时应该使用流包装器和套接字。谁能告诉我什么时候应该在PHP中使用流包装器和套接字?
请给我一些关于同样的例子。
答案 0 :(得分:6)
包装器是附加代码,它告诉流如何处理特定协议/编码。例如,http包装器知道如何将URL转换为远程服务器上文件的HTTP / 1.0请求。默认情况下,PHP中内置了许多包装器(参见Supported Protocols and Wrappers)
使用fopen
或file_get_contents
等功能打开URL,FTP连接等时,可以使用Stream包装器。流包装器的好处是您不需要了解协议(除非您编写自己的自定义包装器)。
由于您通过常规file functionsDocs汇集了所有访问权限,因此您无需了解另一个有益的API。您可能已经使用了Stream Wrappers而没有注意到它,例如,当您执行
时$pageContent = file_get_contents('http://example.com');
代码中的某处。 Stream Wrapper的另一个好处是您可以将过滤器放在前面并以最小的努力修改流,例如
$unzipped = file_get_contents('compress.zlib://http://example.com');
将通过gzip解压缩从该网页运行内容。
套接字扩展实现了基于流行的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的帮助: