在现代php特性中,流或许是最出色但使用率最低的。虽然PHP4.3就引入了流,但是很多开发者并不知道流的存在,因为人们很少提及流,而且流的文档也很匮乏。PHP官方文档对流的解释如下: 流的作用是提供统一的公共函数来处理文件、网络和数据压缩等操作。简单而言,流是具有流式行为的资源对象,也就是说,流可以线性读写,并且可以通过fseek()之类的函数定位到流中的任何位置。可能看完这段解释后还是云里雾里,我们简化一下,流的作用是在出发地和目的地之间传输数据。出发地和目的地可以是文件、命令行进程、网络连接、ZIP或TAR压缩文件、临时内存、标准输入或输出,或者是通过PHP流封装协议实现的任何其他资源。 如果你读写过文件,就用过流;如果你从php://stdin读取过数据,或者把输入写入php://stdout,也用过流。流为PHP的很多IO函数提供了底层实现,如file_get_contents、fopn、fread和fwrite等。PHP的流函数提供了不同资源的统一接口。 我们可以把流比作管道,把水(资源数据)从一个地方引到另一个地方。在水从出发地到目的地的过程中,我们可以过滤水,可以改变水质,可以添加水,也可以排出水。 流封装协议 流式数据的种类各异,每种类型需要独特的协议,以便读写数据,我们称这些协议为流封装协议。例如,我们可以读写文件系统,可以通过HTTP、HTTPS或SSH与远程Web服务器通信,还可以打开并读写ZIP、RAR或PHAR压缩文件。这些通信方式都包含下述相同的过程: 开始通信 读取数据 写入数据 结束通信 虽然过程是一样的,但是读写文件系统中文件的方式与收发HTTP消息的方式有所不同,流封装协议的作用是使用通用的接口封装这种差异。 每个流都有一个协议和一个目标。指定协议和目标的方法是使用流标识符:scheme://target,其中scheme是流的封装协议,target是流的数据源。 |