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

什么时候我们应该在PHP中使用流包装器和套接字?,php,Php,我不明白什么时候应该使用流包装器和套接字。有人能告诉我什么时候应该在PHP中使用流包装器和套接字吗 请给我一些同样的例子。StreamWrappers 引用PHP手册,网址为: 包装器是告诉流如何处理特定协议/编码的附加代码。例如,http包装器知道如何将URL转换为远程服务器上文件的http/1.0请求。默认情况下,PHP中内置了许多包装器(请参阅) 无论何时打开URL、FTP连接等,您都可以使用流包装器,其功能包括fopen或file\u get\u contents。流包装器的好处是您不需

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

请给我一些同样的例子。

StreamWrappers 引用PHP手册,网址为:

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

无论何时打开URL、FTP连接等,您都可以使用流包装器,其功能包括
fopen
file\u get\u contents
。流包装器的好处是您不需要对协议了解太多(除非您编写自己的自定义包装器)

由于您可以通过常规API进行所有访问,因此不需要学习另一种API,这是一种优势。例如,您可能已经在不知不觉中使用了流包装器

$pageContent = file_get_contents('http://example.com');
在代码的某个地方。流包装器的另一个好处是,您可以将过滤器放在前面,并以最小的工作量修改流

$unzipped = file_get_contents('compress.zlib://http://example.com');
将通过gzip解压缩运行该网页中的内容

插座 引用PHP手册,网址为:

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

由于PHP提供了大量现成的流包装器,并且几乎所有内容都有一个API,所以很少有使用套接字的用例

当需要在协议级别实现以实现特定协议的客户端或服务器时,可以使用套接字。这通常需要对实现的协议有深入的了解,例如,要执行与上述示例中的
file\u get\u contents
调用相同的操作,您需要执行(,您甚至需要执行更多实际操作)

$fp=fsockopen(“www.example.com”,80,$errno,$errstr,30);
如果(!$fp){
回显“$errstr($errno)
\n”; }否则{ $out=“GET/HTTP/1.1\r\n”; $out.=“主机:www.example.com\r\n”; $out.=“连接:关闭\r\n\r\n”; fwrite($fp,$out); 而(!feof($fp)){ echo fgets(fp,128美元); } fclose($fp); }
正如您所看到的,您需要知道如何构造HTTP请求以及如何解析HTTP响应,而不是仅仅调用URL并让流包装器处理所有细节

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


请您将问题的范围扩大一点,因为我认为这可能属于常见问题解答“很难说出这里要问什么”。这个问题模棱两可、含糊不清、不完整、过于宽泛或带有修辞色彩,无法以目前的形式得到合理的回答。有关澄清此问题以便重新打开的帮助,请参阅。您应该在需要时使用它。你需要它吗?我们可以用流包装器实现什么?@Jimit请更具体一点。我已经在我的回答中告诉过你你能取得什么成就。流包装器通过PHP的文件API提供对任意流资源的访问。您可能陈述错误,但流包装器不用于HTTP、FTP、文件等。这些是标准的现有流,其中流包装器用于创建自定义流。例如,由于websocket流类型不存在,您可以创建一个ws://流包装器。
$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);
}